通过在应用上使用搜索框,数据库具有2个表,如下所示:
________________
|**Services**
________________
|=>id
|=>name
|=>description
|=>other_columns
________________
和:
________________
|**Products**
________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________
=>每个服务包含许多产品
=>由于搜索框的形式:
用户可以搜索products
的字词,然后可选地选择一项服务,因此,我用口才来检索以下结果:
如果用户未选择特定服务以进行搜索:
$data = Product::where('name','like',"%$search_value%")
->orWhere('description','like',"%$search_value%")
->orWhere('description_long','like',"%$search_value%")
->paginate($items_per_page);
如果用户选择了特定服务:
$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);
模型关系如下:
产品型号:
public function service(){
return $this->belongsTo(Service::class);
}
服务型号:
public function products(){
return $this->hasMany(Product::class);
}
在两种情况下,$data
始终包含所有产品行。如何取得正确的结果?
答案 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'));
})