将此 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 模型? 是的,@RossWilson Student -> SubjectStudent -> 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的主要内容,如果未能解决你的问题,请参考以下文章