Laravel ORM如何按多对多关联的另一张表条件筛选记录
你可以直接用 Eloquent ORM 提供的 whereHas() 方法实现关联筛选,不需要手动写 JOIN 逻辑,后续如果要同时处理其他关联也可以直接链式调用方法,可维护性比 DB facade 写法高很多。
实现代码
假设你的 apps 表对应的模型类为 App\Models\App,且你在模型中定义的多对多关联方法名为 categories,代码如下:
use App\Models\App; $apps = App::whereHas('categories', function ($query) use ($categories) { // 这里的categories.id要和你实际的分类表主键名对应 $query->whereIn('categories.id', $categories); }) // 如果需要同时预加载关联数据,比如你提到的另一个多对多关联,直接加with即可 ->with('categories', '你的另一个多对多关联方法名') ->get();
补充说明
- 这种写法会自动处理中间表的关联查询,和你原有 DB facade 实现的逻辑执行结果完全一致,生成的SQL没有额外性能开销。
- 搭配
with()预加载可以避免 N+1 查询问题,直接同时拿到apps关联的所有分类、其他关联表的数据,不用再单独写查询。 - 如果需要筛选出同时属于所有传入分类的apps,可以给
whereHas加数量约束:$apps = App::whereHas('categories', function ($query) use ($categories) { $query->whereIn('categories.id', $categories); }, '=', count($categories))->get();
内容的提问来源于stack exchange,提问作者luisfer
相关产品推荐
相关产品推荐

