如何重构此搜索过滤器查询?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何重构此搜索过滤器查询?相关的知识,希望对你有一定的参考价值。

我需要在多个表中搜索。我正在检查每个请求对象。例如:我正在检查请求是否具有该对象,然后将其与我的主查询进行仲裁并在最后获取该查询结果。它看起来并不好。如何在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;
答案

使用conditional clauses

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);
    })
    ...
另一答案
$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;
另一答案

我赞成@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;

我认为这更具可读性,并且需要更少的代码。

以上是关于如何重构此搜索过滤器查询?的主要内容,如果未能解决你的问题,请参考以下文章

为什么我不能在此片段中生成唯一对象数组?

如何将此过滤器表达式更改为参数化查询?

Elasticsearch--搜索

如何重构此 django 查询以不选择每个单独的对象?

如何使用此搜索过滤 ListView 使用 OnListItemClickListener

连同其他表格一起提交搜索查询