使用 whereHas 查询数组

我想按类别过滤产品(多对多关系)。基本上,用户选择要显示的类别。我要过滤的类别在$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);,但实际上并没有给我任何结果。



千巷猫影
浏览 232回答 3
3回答

慕标5832272

改变了获取数据的方法,$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);

holdtom

我正在改进其他人的答案。下面是过滤后的代码$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通过传入关键字来简单地在标题字段上使用。$products = Product::all();$titles = [];foreach($request->keywords as $keyword) {    $titles[] = $keyword;}$products = Product::whereHas('categories', function($q) use ($keyword){    $q->whereIn('title', $titles);})->get();
打开App,查看更多内容
随时随地看视频慕课网APP