我的产品与过滤器有很多关系 用户可以选择多个过滤器,我想显示与所选过滤器匹配的所有产品。但是通过匹配它们我的意思是包含所有这些(不仅仅是其中一些)。这里有一个例子来解释我的意思,让我们说用户在汽车类别页面上,他想要过滤所有2013年和4x4的汽车。现在,如果用户选择那些过滤器,它将显示所有来自2013年或具有4x4的汽车。 这是我在控制器中的代码:
public function showFilteredProducts(Request $request)
{
$products = collect([]);
$this->request = $request;
foreach ($request->filters as $filter_id => $active) {
$this->filter_id = $filter_id;
$queriedProducts = Product::whereHas('filters', function($query) {
$query->where('filters.id', $this->filter_id);
})
->whereHas('category', function($query) {
$query->where('slug', $this->request->category_slug);
})
->get();
foreach ($queriedProducts as $product) {
if (!$products->contains($product)) {
$products[] = $product;
}
}
}
return response()->json($products->chunk(3));
}
正如我解释的那样,如果产品只与其中一个过滤器匹配,那么现在会返回产品,但我希望它们能够匹配所有产品。
答案 0 :(得分:2)
试试这个
public function showFilteredProducts(Request $request)
{
$filters = $request->filters;
$query = Product::query();
foreach ($filters as $filter_id => $active) {
$query = $query->whereHas('filters', function($query) use ($filter_id) {
$query->where('filters.id', $filter_id);
});
}
$query = $query->whereHas('category', function($query) use ($request) {
$query->where('slug', $request->category_slug);
})
$products = $query->get();
return $products->chunk(3);
}
或者,根据您之前的代码,您可以使用array_intersect
,如下所示:
public function showFilteredProducts(Request $request)
{
$products = collect([]);
$this->request = $request;
foreach ($request->filters as $filter_id => $active) {
$this->filter_id = $filter_id;
$queriedProducts = Product::whereHas('filters', function($query) {
$query->where('filters.id', );
})
->whereHas('category', function($query) {
$query->where('slug', $this->request->category_slug);
})
->get();
$products = array_intersect($queriedProducts, $products);
}
return response()->json($products->chunk(3));
}
答案 1 :(得分:0)
我认为您要在要检查的第二个表上使用orWhereHas()
而不是whereHas()
。