这是我的问题。
product_field_glue表:
id | field_id | value
----------------------
1 | 50 | blue
2 | 51 | wood
3 | 50 | red
4 | 35 | car
我需要根据_GET params
按此字段搜索产品/?field[50][]=blue&field[35][]=car
这应该归还所有蓝色汽车
$result = Products::select('products.*')
->leftJoin('product_field_glue', function ($join) {
$join->on('product_field_glue.product_code', '=', 'products.product_code');
})
->where(function($query) use ($id, $value){
$query->where('product_fields.field_id', $id);
$query->where('product_fields.value', $value);
})
这是修改(部分)查询。如您所见,我需要为GET参数的所有_GET['field']
和$key=>$value
设置'where',将其分组在哪里。
也许你可以推荐这种搜索更好的解决方案。
答案 0 :(得分:1)
我喜欢使用scopes。
在Products
课程内:
/**
* Warning: requires a join on product_field_glue table
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $fields
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeSearchFields($query, $fields) {
if (empty($fields)) {
return $query;
}
foreach ($fields as $id => $values) {
$query = $query->where(function ($subquery) use($id, $values) {
$subquery->where('product_field_glue.field_id', $id);
$subquery->whereIn('product_field_glue.value', $values);
});
}
return $query;
}
请注意,该方法称为scopeSearchFields
。您可以将其作为链式Products
方法附加到任何searchFields
查询:
$result = Products::select('products.*')
->leftJoin('product_field_glue', function ($join) {
$join->on('product_field_glue.product_code', '=', 'products.product_code');
})
->searchFields($request->input('fields'))
->get();
这样做的好处在于它非常可重用,并且将所有if
和for
循环保留在范围方法中。