首页 > 解决方案 > Laravel 雄辩的构造

问题描述

我有这个表:

Attendances
id | member_id | attended_at
1  | 1         | 01/01/2018
2  | 2         | 01/01/2018
3  | 3         | 01/01/2018
4  | 4         | 01/01/2018
5  | 5         | 01/01/2018

Members
id | church_id
1  | 1
2  | 1
3  | 3
4  | 2
5  | 3

Churches
id | church_location
1  | Olongapo
2  | Bataan
3  | Subic

我的问题来自出席人数表,我需要知道每个教堂地点有多少人出席,以下是我需要的结果:

Olongapo - 2
Bataan - 1
Subic - 2

你能帮我填写下面的代码吗?

$attendances = Attendance::

标签: laravel

解决方案


给出该结果的原始 SQL 如下:

select church_location, count(a.id) from churches as c
inner join members as m on c.id = m.church_id
inner join attendances as a on a.member_id = m.id
group by c.id;

现在要在 Laravel 中翻译它,我将从教堂模型开始,而不是相反。

$attendances = Church::with(['members' => function($query) {
    $query->join('attendances as a', 'a.member_id', '=', 'members.id');
}])
->select([
  'church_location',
  DB::raw('count(a.id) as attendance')
]
->groupBy('id')->get();

你可能需要稍微修改一下,因为我在没有现有模型的情况下翻译成 laravel,但它应该接近你想要的。原始查询在我尝试时确实有效。

- 编辑

要注意的另一件事是,您还必须在模型中设置关系才能使上面的代码正常工作。

-- 使用查询生成器编辑

DB::table('churches as c')
->select([
    'c.church_location',
    DB::raw('count(a.id) as attendance')
])
->join('members as m', 'm.church_id', '=', 'c.id')
->join('attendances as a', 'm.member_id', '=', 'm.id')
->groupBy('c.id')
->get();

推荐阅读