Mysql 多个在哪里
我正在使用eloqent过滤一组产品:Mysql 多个在哪里,mysql,laravel,laravel-4,eloquent,laravel-5,Mysql,Laravel,Laravel 4,Eloquent,Laravel 5,我正在使用eloqent过滤一组产品: Product::whereIn('color', $color)->whereIn('size', $size)->whereIn('price', $price)->get(); 上述每个变量都是一个ID数组 $color = [1,2,4,5] 我的问题是,如果用户无法发送一组变量,比如说他们不需要任何颜色过滤器,那么数组将是: $color = []; 我尝试了->toSql,它生成了sql语句: select * fro
Product::whereIn('color', $color)->whereIn('size', $size)->whereIn('price', $price)->get();
上述每个变量都是一个ID数组
$color = [1,2,4,5]
我的问题是,如果用户无法发送一组变量,比如说他们不需要任何颜色过滤器,那么数组将是:
$color = [];
我尝试了->toSql,它生成了sql语句:
select * from `products` where `color` in (?, ?) and 0 = 1 and `price` in (?, ?, ?, ?, ?)
在上面的示例中,未发送任何大小的过滤器
0=1意味着什么?这是一种低效的处理方式吗?这是一个非常有趣的问题 0=1将始终为false,因此您的查询将返回零行。但这是为什么呢 因为通过设置
->whereIn('size', $size)
Laravel假设您总是希望返回的行具有传递数组中的一个大小。如果不在数组中传递任何值,Laravel将无法执行此操作,因为这将是语法错误(您基本上说给我所有匹配此大小的行,但不传递大小)。因此,如果数组为空,它只会将0=1
为了告诉Laravel,如果没有通过任何尺寸,不为尺寸添加条件,只需在这之前做一个简单的检查
$product = new Product;
if (!empty($sizes)) {
$product = $product->whereIn('size', $sizes);
}
$products = $product->get();
顺便说一句,这种行为是一种错误。在以前版本的Laravel中,如果传递空数组,则会因语法错误引发异常。现在只需设置
1=0
即可处理,谢谢。所以我应该做一些类似$query=Product::all()的事情;然后对每个过滤器进行where检查,如果不为空,则执行$query->where('myfilter',$requestedFilter);但是,这样做会不会执行多个查询,而且效率低下?@panthro no,Product::all()
将一次获取所有产品。您应该这样做:$product=新产品代码>然后进行检查并添加条件。因此,它将类似于$product=新产品//检查过滤器$产品->获取()@潘瑟罗:没错。我用一个例子编辑了我的答案。@panthro是的。在调用->get()