多个在哪里

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