Laravel多对多关联下,查询含最大total值部件的工具方法
解决方法
嘿,这个需求我之前做过类似的,咱们分几种方式来实现,你可以根据自己的场景选:
方法一:分步查询(直观易读)
先找到拥有最大total值的部件ID,再通过多对多关联筛选出关联该部件的工具:
// 1. 获取拥有最大total的部件ID(如果多个部件total相同且都是最大值,这里只会取第一个,要注意) $topPartId = PartDetail::orderBy('total', 'desc')->value('part_id'); // 2. 筛选出所有关联这个部件的工具 $targetTools = Tool::whereHas('parts', function ($query) use ($topPartId) { $query->where('parts.id', $topPartId); })->get();
方法二:子查询一步到位(更高效)
如果想减少数据库查询次数,可以用子查询直接完成:
$targetTools = Tool::whereHas('parts', function ($query) { // 子查询获取最大total对应的部件ID $query->whereIn('parts.id', function ($subQuery) { $subQuery->select('part_id') ->from('part_details') ->orderBy('total', 'desc') ->limit(1); }); })->get();
方法三:处理多个部件共享最大total的情况
如果存在多个部件的total值都是最大值,上面的方法会漏掉关联其他最大total部件的工具,这时候可以这么写:
// 先拿到最大的total值 $maxTotal = PartDetail::max('total'); // 筛选关联了所有拥有maxTotal的部件的工具 $targetTools = Tool::whereHas('parts', function ($query) use ($maxTotal) { $query->whereIn('parts.id', function ($subQuery) use ($maxTotal) { $subQuery->select('part_id') ->from('part_details') ->where('total', $maxTotal); }); })->get();
重要提示!
你的Tool模型里的关联方法有个小问题:中间表实际是tool_parts,但你写的是'tool_part',这会导致Laravel找不到中间表,得修正一下:
// Tool模型的parts关联方法修正后 public function parts() { return $this->belongsToMany('App\Part', 'tool_parts'); }
内容的提问来源于stack exchange,提问作者punk73
相关产品推荐
相关产品推荐

