Как я могу фильтровать по условию поиска в Laravel? - PullRequest
2 голосов
/ 28 мая 2019

Каждый создал свой код для фильтрации поисковых запросов по полу, национальности, цели и возрасту, но все эти приложения работают отдельно. Я хочу сделать это результатом. Я хотел бы знать, как реагировать на различные условия одновременно. Например, если пол и возраст услышаны сразу, я должен вернуть результаты по нему, и я хочу знать, как. Здесь я хочу решить две вещи. 1. Применить условие наложения всех результатов поиска 2. При входе на страницу без поиска список не печатался

//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 search
     if (!empty($request->goal) && $request->goal !== 'all') {

        $penpals = $this->penpalModel->where('goal_id',$request->goal)->latest();
     }


    //age search
    if($request->ageMin != 1 || $request->ageMax != 100 ){

        $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])
        ->orderBy('penpals.created_at','desc');

    }


    //search result
    $penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12); 
$penpalsCount = count($penpalsData);

    return view('penpal.index')->with([
        'penpals'       => $penpalsData,
        'penpalsCount'  => $penpalsCount
        ]);

1 Ответ

0 голосов
/ 28 мая 2019

То, что я хотел бы сделать, это построить объект по ходу поиска по фильтрам.

То, что вы делаете в настоящее время, - это применение фильтра и его внезапное завершение для каждого.

Сначала примените каждый присутствующий фильтр, а затем в конце выполните поиск.

Сделай так:

add filter (age).
add filter (nationality).
-> then finally execute search.

Не

filter (age) -> search. execute.
filter (nationality) -> search. execute.

Вот идея (конечно, это не проверено):

<?php


// $penpals =  $this->penpalModel->getUsers()->latest()->paginate(12);
// base penpals object
$penpals = $this->penpalModel;
// start out with the initial original object, untouched

// if nickname is present, add filter nickname
if (!empty($request->name)) {
    $users = $this->userModel->where('name', 'like', '%' . $request->name . '%')->get();
    if (!empty($users)) {
        // apply | attached user ids found
        $penpals->whereIn('user_id', $users);
    }        
}
// dont cut off the query and execute yet, continually check other filters
if (!empty($request->gender) && $request->gender !== 'all') { 
    $penpals->leftJoin('users', 'penpals.user_id', '=', 'users.id')
    ->select('penpals.*', 'users.gender')
    ->where('users.gender', $request->gender); 
}
// again, continue to the next set of filters (country search)
// and so on, the same syntax, build off of the base object and continually connect filters

// then on the end, EXECUTE it!

$penpalsData = $penpals->orderBy('penpals.created_at','desc')->paginate(12); // execute then builder after several layers of filters are applied!
$penpalsCount = count($penpalsData);


return view('penpal.index')->with([
    'penpals'       => $penpalsData,
    'penpalsCount'  => $penpalsCount
]);

Просто следуйте этой идее или концепции, это не ваша копия, а тип работы. Измените его и правильно подогнать под вашу бизнес-логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...