You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel多对多关联的中间表上应用筛选条件查询

问题原因

你当前使用的with()方法属于预加载约束,仅会过滤关联模型categories返回的内容,不会对主模型Listing的查询结果做筛选,所以才会返回所有Listing记录,只是不符合分类条件的记录关联的categories是空数组而已。

正确实现方案

需要配合whereHas()方法来筛选关联了指定分类的主模型记录,代码修改如下:

if($request->categories){
    $var = $request->categories; // 数组格式,例如[1,2,3]
    $lists = Listing::with(['categories' => function ($query) use($var) {
            $query->whereIn('category_id',$var);
        }])
        ->whereHas('categories', function ($query) use($var) {
            $query->whereIn('category_id', $var);
        })
        ->get();
    dd($lists);
}

场景补充说明

  • 如果你需要返回的Listing记录里的categories关联只包含你筛选的指定分类:保留with里的闭包约束即可
  • 如果你需要返回的Listing记录里的categories关联包含该记录关联的全部分类:with直接写关联名with('categories')不需要加闭包约束
  • 如果你需要筛选同时关联所有指定分类的Listing(不是只要关联其中任意一个),可以给whereHas加数量匹配参数:
->whereHas('categories', function ($query) use($var) {
    $query->whereIn('category_id', $var);
}, '=', count($var))

内容的提问来源于stack exchange,提问作者Black core

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:57:02