laravel - 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::
解决方案
给出该结果的原始 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();
推荐阅读
- sql - 在sql中创建动态临时表
- awk - 在匹配模式之间添加一行 - unix
- kotlin-flow - Android Flow - 在资源中过滤返回值
- google-bigquery - Bigquery.client() thorws Oauth 连接超时错误
- html - 当我将页面翻译成中文或日文时,字符将正常显示
- javascript - 在没有 node.js 和没有 CDN 的网页中包含 Chart.js
- sql - 将table1中的column1与table2中的column1匹配,并返回table2中与table1的column1匹配的*记录
- postgresql - Postgresql 导入转储,用户与 postgres 不同
- fastapi - 如何在 fast-api 中发送多个响应(FileResponse 和 JsonResponse)?
- flutter - 在颤振应用程序中添加提供程序包时出错