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

Laravel Eloquent如何统计指定活动下各部门所属的报名参与者数量

实现方案

你可以直接在原有部门统计查询的基础上,给withCount关联计数增加指定活动的过滤条件即可实现需求,示例代码如下:

方案1:无需新增关联,直接写查询条件

假设你要统计的指定活动ID为$eventId,查询代码:

use Illuminate\Support\Facades\DB;

$eventId = 1; // 替换为实际要统计的活动ID

$departments = Department::select(['id', 'name'])
    ->withCount(['participants as event_participants_count' => function ($query) use ($eventId) {
        // 只统计报名了指定活动的参与者
        $query->whereExists(function ($subQuery) use ($eventId) {
            $subQuery->from('event_participant')
                ->whereColumn('event_participant.participant_id', 'participants.id')
                ->where('event_participant.event_id', $eventId);
        });
    }])
    ->orderByDesc('event_participants_count')
    ->get();

查询结果中每个部门对象的event_participants_count属性即为对应部门在该活动下的报名人数,无报名的部门该值默认为0,符合要求。

方案2:新增关联复用查询(适合高频使用场景)

你可以先在Department模型中新增跨表关联,简化后续查询逻辑:

// Department.php 模型文件中新增方法
public function eventParticipantRelations()
{
    return $this->hasManyThrough(
        \App\Models\EventParticipant::class,
        \App\Models\Participant::class,
        'department_id', // participants表关联departments的外键
        'participant_id', // event_participant表关联participants的外键
        'id', // departments表主键
        'id' // participants表主键
    );
}

新增关联后查询代码可简化为:

$eventId = 1;
$departments = Department::select(['id', 'name'])
    ->withCount(['eventParticipantRelations as event_participants_count' => function ($query) use ($eventId) {
        $query->where('event_id', $eventId);
    }])
    ->orderByDesc('event_participants_count')
    ->get();

注意事项

  • 由于模型都开启了软删除,Eloquent关联默认会自动过滤已软删除的Participant、Department记录,无需额外加软删除过滤条件。
  • 如果需要统计满足指定付款状态的报名人数,只需要在whereExists的子查询或者eventParticipantRelations的过滤闭包中新增where('payment_state', '对应状态值')的条件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:02