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

时间:2018-12-12 10:58:29

标签: laravel laravel-5

我需要在多个表中搜索。我正在检查每个请求对象。例如:我正在检查请求中是否包含该对象,然后将其浓缩到我的主查询中,最后获得该查询结果。它看起来并不好。如何在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 :(得分:3)

使用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);
    })
    ...

答案 1 :(得分:1)

User

答案 2 :(得分:1)

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

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