Как выбрать из таблицы на основе значений другой таблицы Eloquent? - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь получить данные о некоторых студентах, которые все еще активны. Даже если у меня есть данные от неактивных студентов в одной таблице.

Это StudentAttendance

enter image description here

Это StudentClass

enter image description here

Это красноречивый запрос, с которым я пришел:

        StudentAttendance::
          select('student_classes.active', 'student_attendances.student_id', 'student_attendances.classroom_id', 'classrooms.classroom', 'attendance_rules.option')
        ->join('classrooms', 'classrooms.id', '=', 'student_attendances.classroom_id')
        ->join('attendance_rules','attendance_rules.id', '=', 'student_attendances.attendance_id')
        ->join('student_classes', 'student_attendances.student_id', '=', 'student_classes.student_id')
        ->where('attendance_date', date("Y-m-d"))        
        ->orderBy('classrooms.classroom', 'ASC')
        ->get();

SQL:

select `student_classes`.`active`, `student_attendances`.`student_id`, `student_attendances`.`classroom_id`, `classrooms`.`classroom`, `attendance_rules`.`option` 
from `student_attendances` 
inner join `classrooms` on `classrooms`.`id` = `student_attendances`.`classroom_id` 
inner join `attendance_rules` on `attendance_rules`.`id` = `student_attendances`.`attendance_id` 
inner join `student_classes` on `student_attendances`.`student_id` = `student_classes`.`student_id` 
where `attendance_date` = '2020-02-11' 
order by `classrooms`.`classroom` asc

Теперь мой Eloquent запрос приводит к следующему:

enter image description here

Как вы можете видеть, student_id 22 с classroom_id 2 неактивен, но он появляется быть неактивным один раз, а остальные активными. Если я удалю объединение student_classes, я не получу все повторяющиеся результаты.

Цель состоит в том, чтобы отобразить все сегодняшние посещения, где студент активен (active = 1), в StudentClass, даже если я запрашиваю в Студенческое присутствие.

1 Ответ

2 голосов
/ 12 февраля 2020

Вы захотите настроить объединение на student_classes, чтобы просматривать только активные записи.

Это можно сделать с помощью обратного вызова в методе объединения:

->join('student_classes', function ($join) {
    $join->on('student_attendances.student_id', '=', 'student_classes.student_id')
        ->on('student_classes.classroom_id', '=', 'student_attendances.classroom_id')
        ->where('student_classes.active', 1);
})

Это рассматривается в разделе «Дополнительные условия объединения» в документации по Query Builder - https://laravel.com/docs/5.8/queries#joins

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...