【问题标题】:Convert this SQL statement to Laravel ORM将此 SQL 语句转换为 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 之间有没有建立关系?

标签: laravel orm


【解决方案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
猜你喜欢
  • 2014-05-09
  • 2017-03-09
  • 2019-10-31
  • 1970-01-01
  • 2015-09-21
  • 2012-05-22
  • 1970-01-01
  • 2023-03-12
  • 2015-08-19
相关资源
最近更新 更多