为了账号安全,请及时绑定邮箱和手机立即绑定

使用 whereHas 查询数组

使用 whereHas 查询数组

PHP
千巷猫影 2021-06-30 13:08:03
我想按类别过滤产品(多对多关系)。基本上,用户选择要显示的类别。我要过滤的类别在$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 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

改变了获取数据的方法,


$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);


查看完整回答
反对 回复 2021-07-16
?
holdtom

TA贡献1805条经验 获得超10个赞

我正在改进其他人的答案。下面是过滤后的代码


$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);

你可以试试这个。


查看完整回答
反对 回复 2021-07-16
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您可以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();


查看完整回答
反对 回复 2021-07-16
  • 3 回答
  • 0 关注
  • 226 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信