Массив запросов с использованием whereHas - PullRequest
4 голосов
/ 28 мая 2019

Я хочу отфильтровать товары по категориям (отношения много-много). В основном пользователь выбирает, какие категории показывать. Категории, которые я хочу отфильтровать, находятся в $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);, но это на самом деле не дает никаких результатов.

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

Ответы [ 3 ]

1 голос
/ 28 мая 2019

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

$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);
0 голосов
/ 28 мая 2019

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

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

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

0 голосов
/ 28 мая 2019

Вы можете просто использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...