Как вывести данные из несколько связанных таблиц 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