Предположим, у меня есть приложение Laravel 5.5 с четырьмя моделями:
Class
, Student
, Assignment
и AssignmentSubmission
A 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()
в правильном порядке, чтобы получить то, что я хочу. Кажется, что я делаю это только с необработанными запросами, но идентификатор события будет неанимирован, иначе я могу это сделать, но он возвращает только поле assignment_count
, а не остальные поля для student
.
$class->students()
->selectSub(
AssignmentSubmission::selectRaw('count(*)')
->whereClassId($class->id)->getQuery(),
'total_assignment_submissions'
)->toSql();
Должен быть способ сделать это. Что мне здесь не хватает?