【问题标题】:How would I convert this into laravel query builder format?我如何将其转换为 laravel 查询构建器格式?
【发布时间】:2019-12-07 07:37:55
【问题描述】:

我有一个使用常规 sql 表示法的查询,但很难将其转换为 laravel builder 表示法。

查询:

SELECT Course.CourseName
     , SUM(CASE WHEN StudentID <> 0 THEN 1 ELSE 0 END) As InClass
     , Instructor.InstructorFirstName
     , ProgramName
     , SemesterTaught
 FROM program
      JOIN course
        ON program.ProgramID = course.ProgramID
      JOIN (SELECT CourseID
                 , SemesterTaught 
              FROM classtime 
            GROUP BY CourseID, SemesterTaught) AS classtime
        ON course.CourseID = classtime.CourseID
      LEFT JOIN (SELECT InstructorID
                      , CourseID
                      , StudentID 
                   FROM enrolled) AS enrolled
             ON classtime.CourseID = enrolled.CourseID
      LEFT JOIN instructor
             ON enrolled.InstructorID = instructor.InstructorID
GROUP BY CourseName, InstructorFirstName, SemesterTaught, ProgramName 

我尝试过的:

DB::table('programs')
->select('courses.CourseName', 'SUM(CASE WHEN StudentID <> 0 THEN 1 ELSE 0 END AS StudentsInClass', 'instructors.InstructorFirstName', 'ProgramName', 'SemesterTaught')
->join('courses', 'programs.ProgramID', '=', 'course.ProgramID')
->join(DB::raw('(SELECT CourseID, SemesterTaught FROM classtimes GROUP BY CourseID, SemesterTaught) AS classtimes'), 'courses.CourseID', '=', 'classtimes.CourseID')
->leftJoin(DB::raw('(SELECT InstructorID, CourseID, StudentID FROM enrolleds) AS enrolled'), 'classtimes.CourseID', '=', 'enrolled.CourseID')
->leftJoin('instructors', 'enrolled.InstructorID', '=', 'instructors.InstructorID')
->groupBy('courses.CourseName', 'instructors.InstructorFirstName', 'SemesterTaught', 'ProgramName')->get(); 

我想使用 laravel 查询构建器语法来实现这个查询,并尽可能避免使用 DB::raw。我还试图弄清楚如何在我的选择原因中使用聚合函数而不会出现“列不存在错误”。

【问题讨论】:

    标签: sql laravel join subquery query-builder


    【解决方案1】:

    如果将来有人看到这个,想出让查询工作的答案:

    DB::table('programs')
    ->select('courses.CourseName', DB::raw('SUM(CASE WHEN StudentID <> 0 THEN 1 ELSE 0 END) AS StudentsInClass'), 'instructors.InstructorFirstName', 'ProgramName', 'SemesterTaught')
    ->join('courses', 'programs.ProgramID', '=', 'courses.Program')
    ->leftJoin(DB::raw('(SELECT CourseID, SemesterTaught FROM class_times GROUP BY CourseID, SemesterTaught) AS classtimes'), 'courses.CourseID', '=', 'classtimes.CourseID')
    ->leftJoin(DB::raw('(SELECT InstructorID, CourseID, StudentID FROM enrolleds) AS enrolled'), 'classtimes.CourseID', '=', 'enrolled.CourseID')
    ->leftJoin('instructors', 'enrolled.InstructorID', '=', 'instructors.InstructorID')
    ->groupBy('courses.CourseName', 'instructors.InstructorFirstName', 'SemesterTaught', 'ProgramName')->get(); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2023-03-24
      • 2021-12-11
      相关资源
      最近更新 更多