在Laravel Eloquent中使用子查询为选择的关系添加计数列

时间:2019-06-28 13:37:22

标签: php sql laravel eloquent subquery

假设我有一个Laravel 5.5应用,其中包含四个模型:

var hash = CRYPTO.privateDecrypt({ 'key': privateKey, 'passphrase': 'passphrase', 'cipher': 'aes-256-cbc', 'padding': CRYPTO.constants.RSA_PKCS1_PADDING }, buffer).toString(); ClassStudentAssignment

一个AssignmentSubmission属于许多Class,一个Students属于许多Student,一个Classes属于一个AssignmentSubmission,一个{ {1}}和一个Assignment

所以表看起来像这样:

User

现在,在查询构建器类中,我需要构造一个查询,该查询返回属于Class的{​​{1}},并带有一个名为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

但这将返回该学生在所有课程中提交的作业总数。

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

Class

但是我似乎无法以正确的顺序获得total_assignment_submissions $class->students()->withCount('assignmentSubmissions')->get(); 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` = ? 的电话来获得自己想要的东西。似乎我只对原始查询执行此操作,但事件id尚未经过过滤,否则我可以执行此操作,但它仅返回selectSub()字段,而不返回addSelect()的其余字段。 / p>

raw()

必须有一种方法可以做到这一点。我在这里想念什么?

1 个答案:

答案 0 :(得分:2)

withCount()可能受到限制。

$class->students()->withCount(['assignmentSubmissions' => function($q) use($course_id){
    $q->where('course_id', $course_id);
}])->get();

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