Как мне создать оператор запроса для функции фильтра поиска Laravel? Я хотел бы объединить поисковый запрос Laravel в один. Теперь есть проблема с этим кодом. Это не суперпозиция нескольких условий. Я хочу объединить этот запрос в один и получить результаты, удовлетворяющие всем условиям. Что я должен делать?
//펜팔 메인 페이지
public function index (Request $request){
//base Object
$penpals = $this->penpalModel->getUsers();
//name search
if (!empty($request->name)) {
$users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
if (!empty($users)) {
$penpals->whereIn('user_id', $users);
}
}
//gender search
if (!empty($request->gender) && $request->gender !== 'all') {
$penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.gender')
->where('users.gender', $request->gender);
}
//country search
if (!empty($request->country) && $request->country !== 'all') {
$penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.country')
->where(['users.country', $request->country]);
}
// goal name search
if (!empty($request->goal) && $request->goal !== 'all') {
$penpals = $this->penpalModel->where('goal_id',$request->goal)->latest();
}
//age search
if ($request->ageMin || $request->ageMax){
$ageMin = floor($request->ageMin);
$ageMax = floor($request->ageMax);
$penpals = $this->penpalModel->leftJoin('users', 'penpals.user_id', '=', 'users.id')
->select('penpals.*', 'users.age')
->whereBetween('users.age', [$ageMin, $ageMax]);
}
$penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12);
$penpalsCount = count($penpalsData);
return view('penpal.index')->with([
'penpals' => $penpalsData,
'penpalsCount' => $penpalsCount
]);
}
Вы должны добавить отношение user
к модели друга по переписке.
class Penpal extends Model {
...
public function user()
{
return $this->belongsTo(User::class);
}
...
}
Тогда вы можете использовать whereHas
красноречивый метод:
public function index (Request $request){
//query builder
$query = $this->penpalModel->query();
//user fields
if (
$request->name ||
$request->ageMin ||
$request->ageMax ||
($request->gender && $request->gender !== 'all') ||
($request->country && $request->country !== 'all')
){
$query->whereHas('user', function($query) use ($request){
if ($request->name){
$query->where('name', 'like', '%' . $request->name . '%');
}
if ($request->gender && $request->gender !== 'all'){
$query->where('gender', $request->gender);
}
if ($request->country && $request->country !== 'all'){
$query->where('country', $request->country);
}
if ($request->ageMin){
$query->where('age', '>', floor($request->ageMin));
}
if ($request->ageMax){
$query->where('age', '<', floor($request->ageMax));
}
})
}
//goal
if ($request->goal && $request->goal !== 'all') {
$query->where('goal_id', $request->goal);
}
$penpals = $query
->with('user')
->latest()
->paginate(12);
return view('penpal.index')->with([
'penpals' => $penpals,
'penpalsCount' => $penpals->count() //use $query->count() to get count of all results in db, not only in paginator collection
]);
}
К сожалению, это решение не является 100% копией вашего кода/идеи, потому что оно теряет выбор, но фильтрация будет работать правильно, и вы можете получить доступ к пользователю каждого друга по переписке следующим образом:
$penpal->user->name //in php
penpal.user.name //in js
Какова роль запроса()? Внедрение объектов построителя запросов в объекты?