Как вывести данные из несколько связанных таблиц Laravel?

Есть три таблицы Тесты, Вопросы и Ответы. Мне нужно что бы когда человек выбирал тестБ отображались вопросы с вариантами ответа. Сейчас я получаю только сами вопросы.

    class LearnTest extends Model
{
    use HasFactory;
    protected $guarded = false;

    public function question()
    {

        return $this->hasMany(LearnQuestion::class);
    }
}

Миграция тест:

public function up()
{
    Schema::create('learn_tests', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->unsignedBigInteger('course_id');
        $table->foreign('course_id',     'learn_question_course_fk')->on('learn_courses')->references('id');
        $table->timestamps();
    });
}

Вопросы

class LearnQuestion extends Model
{
    use HasFactory;
    protected $guarded = false;

    public function test()
    {

        return $this->belongsTo(LearnTest::class);
    }

    public function answers()
    {
        return $this->hasMany(LearnAnswer::class);

    }
}

Миграция вопрос

  public function up()
{
    Schema::create('learn_questions', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('type_question');
        $table->integer('point');
        $table->unsignedBigInteger('test_id');
        $table->foreign('test_id', 'learn_question_test_fk')->on('learn_tests')->references('id');
        $table->timestamps();


    });
}

Ответы

class LearnAnswer extends Model
{
    use HasFactory;
    protected $guarded = false;

    public function question()
    {
        return $this->belongsTo(LearnQuestion::class);

    }
}

Миграция ответ:

    */
public function up()
{
    Schema::create('learn_answers', function (Blueprint $table) {
        $table->id();
        $table->string('answer');
        $table->unsignedBigInteger('question_id')->nullable();
        $table->string('correct')->nullable();
         $table->foreign('question_id', 'learn_answer_learn_question_fk')->on('learn_questions')->references('id');
        $table->timestamps();

В контроллере

    public function question(Request $request)
{

    $test = $request->test_id;

    $questions = LearnQuestion::where('test_id', '=', $test)->get();

    return view('learn.test.question', compact('questions'));
}

Проблему решила неправильно был написан запрос в контроллере

$questions = LearnQuestion::join('learn_answers', 'learn_questions.id', '=','learn_answers.question_id' )->
        where('test_id', '=', $test)->get();

Но теперь проблема в том что он выводит на форме, Вопрос 1 - Ответ 1, Вопрос 2 - Ответ 2 Как можно сделать так что бы он не дублировал запись вопроса


Ответы (1 шт):

Автор решения: Yauhen Kib

Вопрос, как я понимаю, в области получения данных на основании связей между моделями.

Контроллер у вас правильный, чуть можно модифицировать.

public function question(Request $request)
{
    $test = Test::findOrFail($request->test_id);

    $questions = $test->questions->load('answers'); // load - жадная загрузка

    return view('learn.test.question', compact('test', 'questions'));
}

Выводите варианты ответов в представлении:

/resources/views/tests/show.blade.php

{{ $test->name }}

@foreach($questions as $question)
    {{ $question->name }}

    @foreach($$question->answers as $answer)
         {{ $answer->name }}
    @endforeach
    
@endforeach
→ Ссылка