我想按类别(manyToMany关系)过滤产品。基本上,用户选择要显示的类别。我要过滤的类别在$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);
尝试了同样的方法,但是实际上并没有任何结果。
感谢您的帮助!
答案 0 :(得分:1)
更改了获取数据的方法,
$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);
答案 1 :(得分:0)
您只需输入关键字即可在标题字段上使用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();
答案 2 :(得分:0)
我正在改善其他人的答案。下面是经过过滤的代码在这里
$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);
您可以尝试一下。