我使用eloqent过滤一组产品:
Product::whereIn('color', $color)->whereIn('size', $size)->whereIn('price', $price)->get();
以上每个变量都是一个ids数组
$color = [1,2,4,5]
我的问题是,当用户无法通过一组变量发送时,这是否效率低,说他们不想要任何颜色过滤器,因此阵列将是:
$color = [];
我已尝试过 - > gt; toSql并生成sql语句:
select * from `products` where `color` in (?, ?) and 0 = 1 and `price` in (?, ?, ?, ?, ?)
在上面没有发送过大小的过滤器。
0 = 1是什么意思?这是处理事情的低效方式吗?
答案 0 :(得分:8)
这是一个非常有趣的问题。
0 = 1将始终为false,因此您的查询将返回零行。但为什么会这样呢?
因为设置
->whereIn('size', $size)
Laravel假定您始终希望返回的行与传递的数组中的一个大小相同。如果你没有传递数组中的任何值,Laravel就不能这样做where size IN ()
,因为它会出现语法错误(你基本上说给我所有匹配这个大小的行,但是你没有传递大小)。因此,如果数组为空,则只需放置0 = 1
。
为了告诉Laravel,如果没有传递大小,为了不添加大小条件,只需在此之前进行简单的检查。
$product = new Product;
if (!empty($sizes)) {
$product = $product->whereIn('size', $sizes);
}
$products = $product->get();
顺便说一下,这种行为是hotfix。在以前版本的Laravel中,如果传递空数组,则只会因语法错误而抛出异常。现在只需设置1 = 0