使用foreach或类似的东西在查询中添加“where”

时间:2015-10-14 14:55:06

标签: mysql search laravel-5 eloquent laravel-5.1

这是我的问题。

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',将其分组在哪里。 也许你可以推荐这种搜索更好的解决方案。

1 个答案:

答案 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();

这样做的好处在于它非常可重用,并且将所有iffor循环保留在范围方法中。