Добавление столбца подсчета для отфильтрованной связи в выборку с подзапросом в Laravel Eloquent - PullRequest
1 голос
/ 28 июня 2019

Предположим, у меня есть приложение 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();

Должен быть способ сделать это. Что мне здесь не хватает?

1 Ответ

2 голосов
/ 28 июня 2019

withCount() может быть ограничено.

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

Это ограничит счет именно этим курсом.

...