Laravel/Php — Вызов вложенной модели с использованием красноречивого ORM

#php #laravel #eloquent

Вопрос:

Предположим следующее, у меня есть:

Модель Курса:

  • belongsToMany Модель пользователя
  • belongsToMany Модель экзамена
    • HasMany Модель вопроса
      • HasMany Модель Ответов

Таблица Результатов экзамена по курсу

  • id
  • user_id
  • course_id
  • exam_id
  • question_id
  • answer_id

Есть ли лучший способ получить результаты без необходимости прямого запроса таблицы?

В настоящее время я делаю следующее:

 public function displayResult($user, $course, $exam) {
    $course_exam_results = AppCourseExamResult::where([
        'user_id' => $user->id,
        'course_id' => $course->id,
        'exam_id' => $exam->id
    ])
    ->get();

   dd($course_exam_results);
}
 

Хотел бы сделать что-нибудь получше, например auth()->user()->course(??)->exam(??)->results . Я думал об использовании laravel hasManyThrough , но не думаю, что смогу заставить его работать в этом случае, так как он принимает только 2 модели, в то время как мне, возможно, придется вызывать 3-5 моделей одновременно.

Заранее спасибо.

Комментарии:

1. Вы здесь вообще не упомянули Course модель. Кроме того, если ответ относится к одному вопросу, а вопрос-к одному экзамену (и экзамен-к одному курсу?), То question_id, exam_id, course_id может быть функционально определен тем, answer_id какой тип подсказывает мне, что вам нужно переосмыслить то, как вы смоделировали свои модели результатов экзамена по курсу

Ответ №1:

Если вы хотите использовать несколько where букв s в Laravel Eloquent, вы должны сделать, как показано ниже:

  • Вы должны передать where() массиву.
  • Каждый поиск имеет два аргумента, поэтому он представляет собой массив в массиве.
 $course_exam_results = AppCourseExamResult::where([
    ['user_id', auth()->user()->id],
    ['course_id', $course->id],
    ['exam_id', $exam->id]
])
->firstOrFail();