Laravel eloquent count 属于某一特定事件部门的参与者总数

Posted

技术标签:

【中文标题】Laravel eloquent count 属于某一特定事件部门的参与者总数【英文标题】:Laravel eloquent count total of participants that belongs to departments of one specific event 【发布时间】:2021-12-08 12:41:31 【问题描述】:

我当前的查询可以统计属于每个部门的参加人数:

$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 的数据透视表。

注意。我在 EventDepartmentParticipant 模型上使用软删除。

【问题讨论】:

【参考方案1】:

您可以向withCount 添加其他约束。

我跳过了您原始查询的其他部分。

$eventName = 'xyz';

$departments = Department::withCount(['participants' => function ($query) use ($eventName) 
    $query->whereHas('events', function ($query) use ($eventName) 
        $query->where('name', $eventName);
    );
])->orderByDesc('participants_count')->get();

https://laravel.com/docs/8.x/eloquent-relationships#counting-related-models

【讨论】:

谢谢亲爱的!非常感谢您的帮助,这解决了我的问题。为了结束这个查询,我刚刚订购了参与者计数。 ` $departments = Department::withCount(['participants' => function ($query) use ($eventId) $query->whereHas('events', function ($query) use ($eventId) $query- >where('events.id', $eventId); ); ])->orderByDesc('participants_count')->get();` 我已将其添加到查询中。 真的很有帮助,谢谢继续!

以上是关于Laravel eloquent count 属于某一特定事件部门的参与者总数的主要内容,如果未能解决你的问题,请参考以下文章

Laravel count Eloquent belongsToMany 相关模型

laravel Builder scope count() 出错 Eloquent/Builder.php 1185行

Laravel Eloquent Multiple Where with count

Laravel Eloquent - distinct() 和 count() 不能一起正常工作

Laravel 5 / Eloquent - 对属于多的关系进行查询过滤

Laravel Eloquent - 属于许多通过