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
相关产品推荐
相关产品推荐

