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

Laravel中能否使用withCount()统计多级嵌套关联的关联数据总数?

Laravel多级嵌套关联统计总数解决方案

Laravel 原生的withCount方法不支持直接传入events.contacts这类多级嵌套关联路径做统计,你测试的写法无法生效是正常现象。以下是两种可实现「统计指定项目下所有关联事件对应的全部联系人总数」需求的方案:

方案1:定义hasManyThrough关联(推荐)

该方案性能最优、复用性最高,适合高频使用该跨级统计的业务场景。
首先在Project模型中新增跨级关联:

// app/Models/Project.php
public function contacts()
{
    return $this->hasManyThrough(
        \App\Models\Contact::class, // 最终要关联的目标模型
        \App\Models\Event::class, // 中间关联模型
        'project_id', // 中间表(events)关联 projects 表的外键
        'event_id', // 目标表(contacts)关联 events 表的外键
        'id', // projects 表的主键
        'id' // events 表的主键
    );
}

关联定义完成后,直接调用即可得到统计结果:
$project = Project::withCount('contacts')->find($项目ID);
统计结果可通过$project->contacts_count直接获取

方案2:查询构造器聚合统计(无需修改模型)

该方案适合单次临时统计的场景,不需要修改模型文件:

use Illuminate\Support\Facades\DB;

$project = Project::withCount([
    'events as total_contacts' => function ($query) {
        $query->join('contacts', 'events.id', '=', 'contacts.event_id')
              ->select(DB::raw('COUNT(DISTINCT contacts.id)'));
    }
])->find($项目ID);

统计结果可通过$project->total_contacts直接获取,加入DISTINCT是为了避免出现重复关联数据时统计结果异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:48:02