Использование Where в QueryBuilder - Laravel

У меня есть таблица 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?

Спасибо!

Убедитесь, что вы назвали свою модель Product, а не Products. Модели особенные.

Robo Robok 05.12.2018 04:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
63
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Используйте когда():

$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);

Trần Hưng Vượng 05.12.2018 04:33

Что вы ожидаете получить, если сдадите category_id = 0?

Robo Robok 05.12.2018 04:34

Если у меня есть записи со значением категории поля - это [1,2,3,4...]. Затем при передаче $category_id=0 он вернет все записи в таблице products.

Trần Hưng Vượng 05.12.2018 04:37

Это все меняет. Пожалуйста, посмотрите мой обновленный ответ.

Robo Robok 05.12.2018 04:41

То же самое и раньше. Выглядит это так: 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.

Trần Hưng Vượng 05.12.2018 04:49

Мой ответ делает именно это, попробуйте еще раз :)

Robo Robok 05.12.2018 04:51

Есть у меня другой: Products::where(function($query) use ($category_id){ $query->where("category_id",$category_id) ->orWhereRaw("$category_id = 0"); })->get();

Trần Hưng Vượng 05.12.2018 04:59

Да, это более грязный и менее эффективный способ добиться того же результата. Кроме того, убедитесь, что вы проверили $category_id в своем примере, потому что в противном случае вы можете получить SQL-инъекцию. Использование Query Builder без каких-либо необработанных методов безопасно.

Robo Robok 05.12.2018 05:01

Да, спасибо, @Robo Robok!

Trần Hưng Vượng 05.12.2018 05:06

используй это

Products::where(function($query) use ($category_id){
         $query->where("category_id",$category_id)
        ->orWhere("category_id",0);
})->get();

По моим данным, у category_id=0 нет ни одной записи. Я хочу, чтобы при передаче $category_id=0 мой запрос вернул все записи. Ваш путь я использовал (см. Мой пост)

Trần Hưng Vượng 05.12.2018 04:51

что не так с вашим кодом:

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

Возможно, будет полезно дать немного предыстории к вашему ответу, чтобы он был более понятным для будущих посетителей.

adam 05.12.2018 05:19

Другие вопросы по теме