Массив запросов с использованием whereHas

Я хочу фильтровать товары по категориям (отношение «многие ко многим»). В основном пользователь выбирает, какие категории показывать. Категории, которые я хочу отфильтровать, находятся в $request->keywords. Вот что я пробовал:

  $products = Product::all();
  foreach($request->keywords as $keyword) {
    $products = Product::whereHas('categories', function($q) use ($keyword){
      $q->where('title', '=', $keyword);
    })->get();
  }

  return response()->json($products);

Проблема в том, что это не все категории, а только продукты с последней категорией в массиве. Я предполагаю, что на данный момент: $q->where('title', '=', $keyword);, $q не сохраняет результаты последней итерации цикла, но всегда удаляет результаты последнего цикла. Я также пробовал то же самое с $q->orWhere('title', '=', $keyword);, но на самом деле это не дает мне никаких результатов.

Спасибо за вашу помощь!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
1 335
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете просто использовать whereIn в поле заголовка, передав свои ключевые слова.

$products = Product::all();
$titles = [];
foreach($request->keywords as $keyword) {
    $titles[] = $keyword;
}
$products = Product::whereHas('categories', function($q) use ($keyword){
    $q->whereIn('title', $titles);
})->get();
Ответ принят как подходящий

Изменен ваш подход к получению данных,

$products = Product::all();
if (!empty($request->keywords)) { // if keywords not empty
    $keyword  = $request->keywords;
    $products = Product::whereHas('categories', function ($q) use ($keyword) {
        $q->whereIn('title', $keyword); // where in for array
    })->get(); // it won't override old data as there is no loop
}

return response()->json($products);

Идеально, большое спасибо! Я так понимаю, проблема была в том, что я не использовал whereIn?

kattapillar 29.05.2019 06:17

Если вы сравните мой фрагмент со своим, вы частично правы

Rahul 29.05.2019 07:48

Я улучшаю ответ других людей. Ниже приведен отфильтрованный код здесь

$builder = new Product;

if ($request->filled('keywords')) {  // if keywords key has any value then query will execute.

    $builder = $builder->whereHas('categories', function($q) use ($request){
                        $q->whereIn('title', array_values($request->keywords));
                    });
}

$items = $builder->get();
dd($items);

Вы можете попробовать это.

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