2015-01-13 3 views
0

У меня есть функция, которая включает в себя следующие строки:Laravel whereNotIn и где не работают вместе вместе

$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.

+1

Убедитесь, что ваши данные выглядит в вашем примере, потому что код в порядке. –

ответ

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, \ поставщика \ Laravel \ Framework \ SRC \ Осветите \ 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); 
} 
+0

Ahhh! Определенно ... noob alert! Хотя это дает мне SQL: 'select * from 'products', где AND 'id' не в (3, 4, 5, 6, 7, 8, 16, 17, 18) 'stock_level'> 0', который я возникли проблемы с получением правильного порядка ... Я действительно глуп? – Djave

+0

Перевернул порядок 'where's. Должно быть правильно работать сейчас. – Mysteryos

+0

Не нужно передавать '' и'', поскольку это значение по умолчанию – lukasgeiter

Смежные вопросы