在 Laravel Eloquent 中使用子查询将过滤关系的计数列添加到选择

假设我有一个包含四个模型的 Laravel 5.5 应用程序:


Class, Student,Assignment和AssignmentSubmission


AClass属于 many Students,aStudent属于 many Classes,anAssignmentSubmission属于 an Assignment、aUser和 a Class。


所以表格看起来像这样:


classes:

  id

  name


students:

  id

  name


class_student:

  class_id

  student_id


assignments:

  id

  name


assignment_submissions:

  id

  class_id

  student_id

  assignment_id

现在,在查询构建器类中,我需要构建一个查询,该查询返回Students属于 的 ,并Class带有一个额外的列,该列会total_assignment_submissions记录学生仅为该类提交的作业数量。


我的第一个停靠港如下:


$class->students()->withCount('assignmentSubmissions')->get();

但这会返回该学生所有课程的总作业提交。


以下 mySql 查询返回正确的数据:


SELECT *,

       (SELECT Count(*)

        FROM   `assignment_submission`

        WHERE  `student_id` = `students`.`id`

               AND `class_id` = ?) AS total_assignment_submissions

FROM   `students`

       INNER JOIN `class_student`

               ON `students`.`id` = `class_student`.`student_id`

WHERE  `class_student`.`class_id` = ?

但我似乎无法以正确的顺序获得selectSub() addSelect()和raw()电话来获得我想要的东西。似乎我只使用原始查询执行此操作,但事件 ID 将未经处理,否则我可以执行此操作,但它只返回该assignment_count字段,而不返回student.


$class->students()

    ->selectSub(

        AssignmentSubmission::selectRaw('count(*)')

            ->whereClassId($class->id)->getQuery(), 

            'total_assignment_submissions'

    )->toSql();

必须有办法做到这一点。我在这里缺少什么?


阿晨1998
浏览 268回答 1
1回答

潇潇雨雨

withCount() 可以被约束。$class->students()->withCount(['assignmentSubmissions' => function($q) use($course_id){    $q->where('course_id', $course_id);}])->get();这将限制该特定课程的计数。
打开App,查看更多内容
随时随地看视频慕课网APP