Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多个在哪里_Mysql_Laravel_Laravel 4_Eloquent_Laravel 5 - Fatal编程技术网

Mysql 多个在哪里

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

我正在使用eloqent过滤一组产品:

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()