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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:02:01