[英]Adding a count column for a filtered relationship to a select with a subquery in Laravel Eloquent
假設我有一個帶有四個模型的Laravel 5.5應用程序:
Class
, Student
, Assignment
和AssignmentSubmission
一個Class
屬於許多Students
,一個Student
屬於多個Classes
,一個AssignmentSubmission
屬於一個Assignment
,一個User
和一個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();
必須有一種方法可以做到這一點。 我在這里想念什么?
withCount()
可以被約束。
$class->students()->withCount(['assignmentSubmissions' => function($q) use($course_id){
$q->where('course_id', $course_id);
}])->get();
這會將計數限制為該特定課程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.