Я пытаюсь добавить модельное отношение в Laravel. Я знаю, как мы можем это сделать, но я не понимаю, я могу связать все модели, которые мне нужны.
Итак, это моя проблема:
Я создаю систему экзаменов, и она работает следующим образом:
Оценка -> Экзамен -> Категория вопроса -> Вопрос -> Ответ.
Итак, в сеансе оценки мы выбираем экзамен, который имеет категории вопросов, вопросы и ответы.
Итак, я написал это:
public function testtheorique($session){
$eval = Evaluation::find($session);
$caces = $eval->caces_cat;
$theorique = $eval->theorique;
$questioncat = $theorique->examcategory;
$question = $questioncat->categoryQuestions;
}
А это мои модели:
//Evaluation Model
public function theorique(){
return $this->belongsTo(TestTheorique::class);
}
//TestThorique Model
public function examcategory(){
return $this->hasMany(QuestionCategorie::class, 'exam_id');
}
//QuestionCategory Model
public function categoryQuestions(){
return $this->hasMany(Question::class, 'category_id', 'id');
}
//Question Model
public function qcategory(){
return $this->belongsTo(QuestionCategorie::class);
}
Поэтому, когда я делаю это dd($eval), у меня отображаются все данные с отношениями, но только до категории экзамена. Я не могу отобразить вопрос, потому что у меня нет отношения.
Так что я не знаю, как я могу иметь отношение вопроса. Я не вижу, где я сделал ошибку.
Спасибо за вашу помощь.
Да когда надо. Я не знаю, как я не могу отобразить вопрос. У меня есть это сообщение об ошибке: Свойство [categoryQuestions] не существует в этом экземпляре коллекции. Как вы думаете, проблема может быть с внешним ключом?






Для использования только пакета laravel/laravel он позволяет вам получить доступ только к 3 таблицам с отношениями hasOneThrough или hasManyThrough.
Чтобы достичь того, что вы хотите или, по крайней мере, я думаю, вы просите, можно сделать с помощью пакетов staudenmeir/eloquent-has-many-deep.
Для Ларавель 8:
composer require staudenmeir/eloquent-has-many-deep:"^1.13"
Для Ларавель 9:
composer require staudenmeir/eloquent-has-many-deep:"^1.7"
Затем,
В вашей модели:
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
и включите в свой класс модели:
use HasRelationships;
Затем в методе вашей модели сделайте hasOneDeep или hasManyDeep в соответствии с использованием:
return $this->hasOneDeep('Model_Name_You_Want_To_Access_Through', ['Model_Access_Via1', 'Model_Access_Via2'], ['ForeignKeyOf_Model_Access_Via1', 'ForeignKeyOf_Model_Access_Via2', 'ForeignKeyOf_Model_Name_You_Want_To_Access_Through']);
Это может продолжаться, но помните, что вы должны предоставить через массив в соответствии со структурой.
Для справки:
https://github.com/staudenmeir/eloquent-has-many-deep
Вариант 2:
В вашей модели ExamId: Вам нужно будет создать некоторые отношения для доступа к вопросам, из модели ExamId, поэтому мы будем использовать модели QuestionCategory и получать доступ ко всему через нее.
ExamId может иметь несколько категорий вопросов (hasMany)
и QuestionCategory будет иметь несколько вопросов (hasMany)
поэтому в вашей модели ExamId:
public function getQCategory()
{
return $this->hasMany('App\Models\QuestionCategory')->with('getQuestion');
}
В вашей модели категории вопросов:
public function getQuestion()
{
return $this->hasMany('App\Models\Question');
}
В вашем контроллере:
$exam = ExamId::with('getQCategory')->find($id);
теперь $exam будет содержать ExamId, категории и вопросы.
Используя это, вы можете вызывать операции с верхнего уровня структуры базы данных.
Хорошо спасибо. Значит, только с laravel мы не можем этого сделать? Нам нужно использовать аддон?
да, вы можете достичь только одного сквозного отношения в обычном красноречивом laravel, скажем, только Evaluation-> ExamId-> questionCategory, но этот пакет позволяет вам проходить многоуровневое множество моделей столько, сколько вам нравится, но они должны быть связаны с внешними ключами, как обычно.
@Chrisdev Я обновил код, пожалуйста, проверьте вариант 2, если он вам подходит.
Нет, у меня ошибка с $id. И для аддона это работает, но у меня есть другая проблема. Он показывает мне вопросы нормально, но ответы не связаны. Я публикую для вас скриншот, чтобы вы могли понять.
Итак, для большей точности, вот именно то, что я хочу с помощью экранов.
Итак, это моя полная функция:
public function testtheorique($session){
$eval = Evaluation::find($session);
$caces = $eval->caces_cat;
$theorique = $eval->theorique;
$questioncat = $theorique->examcategory;
$categories = QuestionCategorie::with(['categoryQuestions' => function ($query) {
$query->inRandomOrder()
->with(['reponse' => function ($query) {
$query->inRandomOrder();
}]);
}])
->whereHas('categoryQuestions')
->get();
return view('session.theorique', compact('categories', 'caces'))
->with('eval', $eval);
}
Итак, когда я делаю dd ($ eval), у меня есть это:
Тогда связь с категорией вопросов
Детали QuestionCategorie без связи с Question
Но я написал это, чтобы попробовать $categories, и у меня есть вопросы с отношением QuestionCategory и Response. Это скриншот из dd($categories)
Подробная информация о категории вопросов
Детали отношений из QuestionCategorie
Подробный вопрос с отношением ответа
Но это нехорошо, потому что у меня есть все вопросы, которые появляются из базы данных, а не те, которые являются частью сеанса TestTheorique.
Итак, я хочу провести одну сессию оценки. В этой сессии есть один TestTheorique (Examid), Затем этот тест с несколькими QuestioCategorie, в котором есть несколько вопросов с ответами.
Полный код будет отправлен в течение нескольких часов.
@Sumitkumar Это хорошо, я нахожу это. Вы дали мне часть ответа, который мне был нужен. Выкладываю решение.
Хорошо, это решено! Вот что я сделал.
В моей модели TestTheorique я изменил эту строку следующим образом:
public function examcategory(){
return $this->hasMany(QuestionCategorie::class, 'exam_id')->with('getQuestion');
}
чтобы установить связь с QuestionCategorie и выберите функцию getQuestion. В моей модели QuestionCategorie я добавляю следующее:
public function getQuestion(){
return $this->hasMany(Question::class, 'category_id', 'id')->with('reponse');
}
}
чтобы установить связь с Вопросом и выбрать функцию ответа. В моей модели вопросов я добавляю следующее:
public function reponse()
{
return $this->hasMany(QuestionReponse::class, 'question_id', 'id');
}
И теперь это работает. Если бы я сделал dd($eval), у меня отобразились бы все данные сеанса, а не все вопросы, записанные в базе данных.
Очень хочу поблагодарить Сумита Кумара за помощь, он дал мне часть ответа.
Теперь я продолжаю свою разработку.
можете ли вы сказать, что каждая из ваших моделей связана с внешним ключом или нет?