多个在哪里

时间:2015-05-29 11:34:36

标签: mysql laravel laravel-4 eloquent laravel-5

我使用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是什么意思?这是处理事情的低效方式吗?

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

即可处理