将此 SQL 语句转换为 Laravel ORM
Posted
技术标签:
【中文标题】将此 SQL 语句转换为 Laravel ORM【英文标题】:Convert this SQL statement to Laravel ORM 【发布时间】:2019-03-31 16:46:53 【问题描述】:如何在 Laravel ORM 中做到这一点?
SELECT
s.id,
s.name AS NAME,
COALESCE(su.cnt, 0) AS SUBJECTs,
COALESCE(e.marks, 0) AS MARKS
FROM student s
LEFT JOIN
(
SELECT student_id, COUNT(*) AS cnt
FROM subject
GROUP BY student_id
) su
ON s.id = su.student_id
LEFT JOIN
(
SELECT student_id, SUM(mark) AS marks
FROM exam
GROUP BY student_id
) e
ON s.id = e.student_id;
我想加入 STUDENT 和 SUBJECT、STUDENT 和 EXAM。当我加入第三个表时出现问题,它重复了结果。
【问题讨论】:
添加“按 s.id 分组”。通过添加此查询,您将获得单个记录而不是重复记录 这肯定是一个简单的SQL问题吗?我应该考虑编辑标签。 你有没有为这些表设置 eloquent 模型? 是的,@RossWilsonStudent
-> Subject
和 Student
-> Exam
之间有没有建立关系?
【参考方案1】:
这是
DB::table('student as su')->selectRaw("
su.id,
su.name,
COALESCE(su.cnt, 0) as SUBJECTS,
COALESCE(e.marks, 0) as MARKS
")->leftJoin(DB::raw("(
SELECT student_id, COUNT(*) AS cnt
FROM subject
GROUP BY student_id
) su"), 's.id', '=', 'su.student_id')
->leftJoin(DB::raw("(
SELECT student_id, SUM(mark) AS marks
FROM exam
GROUP BY student_id
) e"), 's.id', '=', 'e.student_id')
【讨论】:
我看到你在第 1 行和第 10 行中为学生和科目重复了“su”@Malkhazi Dartsmelidze 是的,这是错误的,我没看到。希望代码在更改后可以正常工作。如果可行,请考虑投票 我在标记的最后一个 SUM 中仍然存在小问题,它显示在一个标记上@Makhazi Dartsmelidze以上是关于将此 SQL 语句转换为 Laravel ORM的主要内容,如果未能解决你的问题,请参考以下文章
如何将此 SQL 转换为 Laravel Query Builder 查询?