【发布时间】:2023-03-12 12:26:01
【问题描述】:
我当前的查询可以统计属于每个部门的参加人数:
$departments = Department::select(['departments.id', 'departments.name'])
->with('participants')
->withCount('participants')
->orderByDesc('participants_count')
->groupBy('departments.name')
->groupBy('departments.id')
->get();
我有一张桌子departments 和另一张桌子participants。在参与者表中有一个名为department_id的fk_key,当一个参与者正在注册时,我需要选择他的部门。
在模型Department 内部,我与hasMany 有关系Participant:
public function participants() {
return $this->hasMany(Participant::class, 'department_id');
}
使用这个关系,我可以执行上面的查询,得到如下结果:
#DepartName #participants_count
department_1 12
department_2 5
department_3 44
department_4 33
这里对我来说没有问题。但是问题来了。
首先,在我的数据库中存在一个名为events 的表和另一个名为event_participant 的表。
我可以注册事件,在数据透视表event_participant我可以注册事件的参与者并控制每个事件参与者的付款状态。
这个数据透视表有这些列:
event_participant
id | event_id | participant_id | payment_state
我的模型Event 有一个名为participants 的关系,使用这个关系我可以获得属于每个事件的所有参与者。
public function participants() {
return $this->belongsToMany(Participant::class, 'event_participant',
'event_id',
'participant_id')
->withTimestamps();
}
现在我想计算每个部门的参与者总数,就像上面的查询一样,但是一个特定的事件。
例如:存在两个事件,对于第一个事件,注册了 10 个参与者,这 10 个参与者中有 5 个属于 A 部门,5 个属于 B 部门,所有这些参与者都属于事件 1。并且在我的数据库中存在对于事件一的这个例子,我应该得到 5 个部门:
#departName #participants_count
department_A 5
department_B 5
department_C 0
department_D 0
department_E 0
此报告仅适用于事件一。我的想法是让所有部门的参与者总数为 x event。要注册活动的参与者,我使用了一个名为 event_participant 的数据透视表。
注意。我在 Event、Department 和 Participant 模型上使用软删除。
【问题讨论】:
标签: php mysql laravel database eloquent