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

如何将此 SQL 转换为 Laravel Query Builder 查询?

如何将此 sql 查询转换为 laravel 查询生成器

如何将此查询从SQL(mysql)转换为Eloquent(Laravel)

将原始 SQL 转换为 Laravel 查询构建器

如何将 sql 转换为查询生成器 laravel

如何将此 SQL 内部联接查询转换为 LINQ 语法?