2015-10-14 40 views
1

这是我的问题。用foreach或类似的东西在查询中添加'where'

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); 
     }) 

这是修改搜索这个领域的产品(部分的)查询。正如你所看到的,我需要设置'where'的所有_GET['field']$key=>$value的GET参数需要分组在哪里。 也许有更好的解决方案,您可以推荐这种搜索。

回答

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循环的范围方法内。

相关问题