Laravel如何从group ID数组中获取belongsToMany关联的全部service数据
Laravel 7多对多关联批量查询关联数据方案
方案1(优先推荐):反向关联查询(性能最优)
直接从Service模型出发,通过多对多关联的whereHas方法筛选出属于指定分组的所有服务,天然自带去重,仅执行1次SQL:
$groupIds = [3, 7, 15]; $services = Service::whereHas('groups', function ($query) use ($groupIds) { $query->whereIn('id', $groupIds); })->get(); // 直接遍历即可使用 foreach ($services as $service) { // 业务逻辑 }
方案2:从Group维度批量查询
如果需要保留分组数据同时获取关联服务,可以用预加载+集合处理,避免N+1查询问题:
$groupIds = [3, 7, 15]; // 批量查询指定分组+预加载关联服务,仅执行2次SQL $groups = Group::with('services')->whereIn('id', $groupIds)->get(); // 摊平所有服务后按id去重得到完整服务集合 $services = $groups->pluck('services')->flatten()->unique('id');
注意:如果不需要保留分组数据,优先使用方案1,查询效率更高,代码更简洁。你原本的循环写法会产生N次查询(N为分组数量),数据量较大时性能损耗明显,上述两种方案都能解决这个问题。
内容的提问来源于stack exchange,提问作者odd_duck
相关产品推荐
相关产品推荐

