为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
阿晨1998 2021-09-05 20:38:39
假设我有一个包含四个模型的 Laravel 5.5 应用程序:Class, Student,Assignment和AssignmentSubmissionAClass属于 many Students,aStudent属于 many Classes,anAssignmentSubmission属于 an Assignment、aUser和 a Class。所以表格看起来像这样:classes:  id  namestudents:  id  nameclass_student:  class_id  student_idassignments:  id  nameassignment_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_submissionsFROM   `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();必须有办法做到这一点。我在这里缺少什么?
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

withCount() 可以被约束。


$class->students()->withCount(['assignmentSubmissions' => function($q) use($course_id){

    $q->where('course_id', $course_id);

}])->get();

这将限制该特定课程的计数。


查看完整回答
反对 回复 2021-09-05
  • 1 回答
  • 0 关注
  • 267 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信