我有一个涉及以下几行的功能:
$products_to_ignore = $this->products()->get()->lists('id'); // returns [1,3,5]
$products = Product::
whereNotIn('id', $products_to_ignore)
->where('stock_level', '>', 0)
->with('producer')
->get();
return $products;
我在下面的行中有一个数据库表
id product_name stock_level
1 eggs 5
2 cheese 0
3 milk 1
4 cucumber 4
5 pie 0
但上面的函数返回[]
如果我只是使用
$products = Product::
where('stock_level', '>', 0)
->with('producer')
->get();
return $products;
我会得到[1,3,4]
,如果我使用:
$products_to_ignore = $this->products()->get()->lists('id'); // returns [1,3,5]
$products = Product::
whereNotIn('id', $products_to_ignore)
->with('producer')
->get();
return $products;
我会得到[2,4]
。
为什么这两个人不能很好地在一起玩?如何获取库存水平大于0的项目,这些项目也不在数组[1,3,5]
中?例如,此问题中的第一段代码应返回产品[4]
,而不是数组中的库存级别> 0
答案 0 :(得分:0)
您有两个where
条件彼此相邻。也许and
会调和它们;)
$products_to_ignore = $this->products()->get()->lists('id'); // returns [1,3,5]
$products = Product::where('stock_level', '>', 0,'AND')
->whereNotIn('id', $products_to_ignore)
->with('producer')
->get();
return $products;
根据API,\ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Query \ Builder.php第773行:
/**
* Add a "where not in" clause to the query.
*
* @param string $column
* @param mixed $values
* @param string $boolean
* @return \Illuminate\Database\Query\Builder|static
*/
public function whereNotIn($column, $values, $boolean = 'and')
{
return $this->whereIn($column, $values, $boolean, true);
}