Выберите модель, где связанные модели соответствуют критериям

У меня есть класс Student и класс Exam, Один студент может сдать много экзаменов, и один экзамен может принадлежать одному студенту. Мне нужно выбрать всех студентов, которые сдают экзамен по "английскому языку", поэтому я пытаюсь сделать следующее:

$english_students = Student::with('Exams')-whereHas('Exams', function($query){
    //logic to return true if the student has a related Exam with name of "English";
})

Моя проблема в том, что у меня нет полного понимания того, что я могу или не могу сделать в закрытии.

3 ответа

Решение
$english_students = Student::with('Exams')-whereHas('Exams', function($query){
     $query->where("name","English");
})->get();

Просто добавьте предложение where к функции обратного вызова:

$english_students = Student::with('Exams')->whereHas('Exams', function($query){

    $query->where('name', 'English');

})->get();

Если вам тоже не нужно сдавать экзамены, используйте метод has:

$english_students = Student::has('exams', '=', 'English')->get(); 
Student::whereHas('Exams', function($q) use($examName) {
    $q->where('name', $examName);
})
->get();

Кроме того, если вам не нужно загружать все студенческие экзамены, удалите with() часть.

Другие вопросы по тегам