使用whereHas的查询数组

时间:2019-05-28 11:45:43

标签: php laravel eloquent

我想按类别(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);尝试了同样的方法,但是实际上并没有任何结果。

感谢您的帮助!

3 个答案:

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

您可以尝试一下。