Я хочу фильтровать товары по категориям (отношение «многие ко многим»). В основном пользователь выбирает, какие категории показывать. Категории, которые я хочу отфильтровать, находятся в $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);
, но на самом деле это не дает мне никаких результатов.
Спасибо за вашу помощь!
Вы можете просто использовать 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);
Если вы сравните мой фрагмент со своим, вы частично правы
Я улучшаю ответ других людей. Ниже приведен отфильтрованный код здесь
$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);
Вы можете попробовать это.
Идеально, большое спасибо! Я так понимаю, проблема была в том, что я не использовал
whereIn
?