Laravel Eloquent-未检索必需的行

时间:2018-12-15 11:07:59

标签: laravel laravel-5 model eloquent

通过在应用上使用搜索框,数据库具有2个表,如下所示:

 ________________
|**Services**
 ________________
|=>id
|=>name
|=>description
|=>other_columns
________________

和:

 ________________
|**Products**
 ________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________

=>每个服务包含许多产品

=>由于搜索框的形式:

enter image description here

用户可以搜索products的字词,然后可选地选择一项服务,因此,我用口才来检索以下结果:

  1. 如果用户未选择特定服务以进行搜索:

    $data = Product::where('name','like',"%$search_value%")
            ->orWhere('description','like',"%$search_value%")
            ->orWhere('description_long','like',"%$search_value%")
            ->paginate($items_per_page);
    
  2. 如果用户选择了特定服务

    $data = Product::where([
                ['name','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->orWhere([
                ['description_long','like',"%$search_value%"],
                ['service_id','=',"%$service%"],
            ])
            ->paginate($items_per_page);
    

模型关系如下:

  1. 产品型号:

    public function service(){
        return $this->belongsTo(Service::class);
    }
    
  2. 服务型号:

    public function products(){
        return $this->hasMany(Product::class);
    }
    

在两种情况下,$data始终包含所有产品行。如何取得正确的结果?

2 个答案:

答案 0 :(得分:1)

%中有['service_id','=',"%$service%"],应将其删除['service_id','=',$service]

%适用于LIKE,而不适用于=

答案 1 :(得分:0)

您可以使用when()根据用户输入来构建动态查询。

$data = Product::query()
    ->when($request->get('service_id') ,function($query, $service_id) {
        $query->where('service_id', $service_id);
    })
    ->where(function($query) use ($search_value) {
        $query->where(('name', 'like', "%$search_value%"))
            ->orWhere('description', 'like', "%$search_value%")
            ->orWhere('description_long', 'like', "%$search_value%");
    })
    ->paginate($items_per_page);

通过将全文搜索条件嵌套在另一个where()子句中,我们不必重复重复where('service_id', $service_id)部分。

如果您在All Services的前端中使用value="all"选择选项,则也可以使用以下when()子句代替上面的子句:

->when($request->filled('service_id') && $request->get('service_id') !== 'all', function ($query) use ($request) {
    $query->where('service_id', $request->get('service_id'));
})