У меня есть таблица Products (id, category_id, name);
Я хочу получить такой результат:
SELECT * FROM Products WHERE category_id=$category_id OR $category_id=0;
Когда я присваиваю $ category_id значение 0 => указанный выше запрос вернет все записи.
Как мне написать этот запрос в Laravel?
Я пробовал это:
Products::where(function($query) use ($category_id){
$query->where("category_id",$category_id)
->orWhere($category_id,0)
})->get();
Но ошибка:
Это похоже на:
SELECT
*
FROM
`products`
WHERE
( `product_category_id` = 0 OR `0` = 0 )
И ошибка печати: Column not found: 1054 Unknown column '0' in 'where clause'
Как исправить: '0' = 0 в 0 = 0?
Спасибо!






Используйте когда():
$products = Product::when($categoryId, function ($query, $categoryId) {
$query->whereCategoryId($categoryId);
})->get();
Этот метод вызовет функцию, только если условие истинно. Вы можете добиться того же с помощью простого оператора if:
$products = Product::query();
if ($categoryId) {
$products->whereCategoryId($categoryId);
}
$products = $products->get();
Используя when(), вы получаете то, что вы не разрываете цепочку, поэтому вы можете использовать условные изменения запроса в одном выражении. Это полезно, например, если вы хотите просто записать его на return.
Не работает! При передаче $ category_id = 0. Ваш запрос ничего не возвращает! Это похоже: SELECT * FROM 'products' WHERE category_id IN (0,0);
Что вы ожидаете получить, если сдадите category_id = 0?
Если у меня есть записи со значением категории поля - это [1,2,3,4...]. Затем при передаче $category_id=0 он вернет все записи в таблице products.
Это все меняет. Пожалуйста, посмотрите мой обновленный ответ.
То же самое и раньше. Выглядит это так: SELECT * FROM 'products' WHERE category_id=0. Когда я прохожу $category_id=0. Хочу вот это: SELECT * FROM Products WHERE category_id=$category_id OR $category_id=0;. Итак, когда я передаю $category_id=1, запрос вернет все записи с category=1, а когда я передам $category_id=0, он вернет все записи в таблице products.
Мой ответ делает именно это, попробуйте еще раз :)
Есть у меня другой: Products::where(function($query) use ($category_id){ $query->where("category_id",$category_id) ->orWhereRaw("$category_id = 0"); })->get();
Да, это более грязный и менее эффективный способ добиться того же результата. Кроме того, убедитесь, что вы проверили $category_id в своем примере, потому что в противном случае вы можете получить SQL-инъекцию. Использование Query Builder без каких-либо необработанных методов безопасно.
Да, спасибо, @Robo Robok!
используй это
Products::where(function($query) use ($category_id){
$query->where("category_id",$category_id)
->orWhere("category_id",0);
})->get();
По моим данным, у category_id=0 нет ни одной записи. Я хочу, чтобы при передаче $category_id=0 мой запрос вернул все записи. Ваш путь я использовал (см. Мой пост)
что не так с вашим кодом:
->orWhere($category_id,0)
вы сделали часть столбца переменной.
попробуйте этот код:
Products::where(function($query) use ($category_id){
return $query->where("category_id", $category_id)
->orWhere("category_id", 0);
})->get();
$product = new Products;
if ($category_id != 0) {
$product = $product->where("category_id", $category_id);
}
$products = $product->get();
Возможно, будет полезно дать немного предыстории к вашему ответу, чтобы он был более понятным для будущих посетителей.
Убедитесь, что вы назвали свою модель
Product, а неProducts. Модели особенные.