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

问题描述 投票:2回答:3

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

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;

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

© www.soinside.com 2019 - 2024. All rights reserved.