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