Как я могу изменить этот запрос фильтра поиска? - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно искать в нескольких таблицах.Я проверяю каждый объект запроса.Например: я проверяю, есть ли в запросе этот объект, затем присоединяю его к моему основному запросу и получаю этот результат в конце.Это не выглядит и не хорошо.Как я могу сделать этот фильтр поисковых запросов лучше в laravel? Примечание: я искал вопросы в stackoverflow, но они имеют дело только с одной моделью.

$query = DB::table('clients')
        ->leftjoin('ecommerce_contacts','ecommerce_contacts.client_id', '=', 'clients.id')
        ->select('ecommerce_contacts.*', 'clients.*')
        ->where('clients.is_deleted', '=', '0');

        if(!is_null($request->fname)){
            $query+=->where('clients.fname', 'like', '%$request->fname%');
        }
        if(!is_null($request->lname)){
            $query+=->where('clients.lname', 'like', '%$request->lname%');            
        }
        if(!is_null($request->gender)){
            $query+=->where('clients.sex', $request->sex);            
        }
        if(!is_null($request->number)){
            $query+=->where('ecommerce_contacts.sex', 'like', $request->number);            
        }
        if(!is_null($request->registered_date)){

        }
        if(!is_null($request->purchase)){

        }
        $client = $query->get();        
        $data = json_encode($clients);
        return $data;

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Использовать условные предложения :

DB::table('clients')
    ->leftjoin('ecommerce_contacts','ecommerce_contacts.client_id', '=', 'clients.id')
    ->select('ecommerce_contacts.*', 'clients.*')
    ->where('clients.is_deleted', '=', '0')
    ->when(request()->has('fname'), function ($query) {
         return $query->where('clients.fname', 'like', '%' . request()->fname . '%');
    })
    ->when(request()->has('lname'), function ($query) {
         return $query->where('clients.lname', 'like', '%' . request()->lname . '%');
    })
    ->when(request()->has('gender'), function ($query) {
         return $query->where('clients.sex', '=', request()->gender);
    })
    ...
0 голосов
/ 12 декабря 2018

Я проголосовал за ответ @DigitalDrifter, потому что он мне понравился, но я предпочитаю свой шаблон фильтра.Посмотрите на это:

$query = DB::table('clients')
    ->leftjoin('ecommerce_contacts','ecommerce_contacts.client_id', '=', 'clients.id')
    ->select('ecommerce_contacts.*', 'clients.*')
    ->where('clients.is_deleted', '=', '0');

    !isset($request->fname)  ?: $query->where('clients.fname', 'like', '%$request->fname%');
    !isset($request->lname)  ?: $query->where('clients.lname', 'like', '%$request->lname%');            
    !isset($request->gender) ?: $query->where('clients.sex', $request->sex);            
    !isset($request->number) ?: $query->where('ecommerce_contacts.sex', 'like', $request->number);     

$client = $query->get();        
$data = json_encode($clients);

return $data;

Я думаю, что это более читабельно и требует меньше строки кода.

0 голосов
/ 12 декабря 2018
$query=DB::table('clients')
            ->leftjoin('ecommerce_contacts','ecommerce_contacts.client_id', '=', 'clients.id')
            ->select('ecommerce_contacts.*', 'clients.*')
            ->where('clients.is_deleted', '=', '0');

        $search_fields=['fname','lname','gender','number','registered_date','purchase'];
        foreach($search_fields as $key){
            if(!is_null($key)){
                $query->orWhere('clients.'.$key, 'LIKE', '"%" . '.$request->$key.' . "%"');
            }
        }
        $client = $query->get();
        $data = json_encode($client);
        return $data;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...