Laravel可以匹配阵列中的所有数据

时间:2017-09-27 13:30:39

标签: php database laravel relationship

我的产品与过滤器有很多关系 用户可以选择多个过滤器,我想显示与所选过滤器匹配的所有产品。但是通过匹配它们我的意思是包含所有这些(不仅仅是其中一些)。这里有一个例子来解释我的意思,让我们说用户在汽车类别页面上,他想要过滤所有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));
}

正如我解释的那样,如果产品只与其中一个过滤器匹配,那么现在会返回产品,但我希望它们能够匹配所有产品。

2 个答案:

答案 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()