Сколько модельных отношений мы можем иметь в Laravel?

Я пытаюсь добавить модельное отношение в 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), у меня отображаются все данные с отношениями, но только до категории экзамена. Я не могу отобразить вопрос, потому что у меня нет отношения.

Так что я не знаю, как я могу иметь отношение вопроса. Я не вижу, где я сделал ошибку.

Спасибо за вашу помощь.

можете ли вы сказать, что каждая из ваших моделей связана с внешним ключом или нет?

Sumit kumar 25.10.2022 12:55

Да когда надо. Я не знаю, как я не могу отобразить вопрос. У меня есть это сообщение об ошибке: Свойство [categoryQuestions] не существует в этом экземпляре коллекции. Как вы думаете, проблема может быть с внешним ключом?

Chrisdev 25.10.2022 13:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Для использования только пакета 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, категории и вопросы.

Используя это, вы можете вызывать операции с верхнего уровня структуры базы данных.

Sumit kumar 25.10.2022 13:09

Хорошо спасибо. Значит, только с laravel мы не можем этого сделать? Нам нужно использовать аддон?

Chrisdev 25.10.2022 14:00

да, вы можете достичь только одного сквозного отношения в обычном красноречивом laravel, скажем, только Evaluation-> ExamId-> questionCategory, но этот пакет позволяет вам проходить многоуровневое множество моделей столько, сколько вам нравится, но они должны быть связаны с внешними ключами, как обычно.

Sumit kumar 25.10.2022 14:03

@Chrisdev Я обновил код, пожалуйста, проверьте вариант 2, если он вам подходит.

Sumit kumar 25.10.2022 14:24

Нет, у меня ошибка с $id. И для аддона это работает, но у меня есть другая проблема. Он показывает мне вопросы нормально, но ответы не связаны. Я публикую для вас скриншот, чтобы вы могли понять.

Chrisdev 25.10.2022 15:05

Итак, для большей точности, вот именно то, что я хочу с помощью экранов.

Итак, это моя полная функция:

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), у меня есть это:

Модель оценки с отношением

Связь с TestTheorique

Тогда связь с категорией вопросов

Детали QuestionCategorie без связи с Question

Но я написал это, чтобы попробовать $categories, и у меня есть вопросы с отношением QuestionCategory и Response. Это скриншот из dd($categories)

Скрин dd($categories)

Подробная информация о категории вопросов

Детали отношений из QuestionCategorie

Подробный вопрос с отношением ответа

Но это нехорошо, потому что у меня есть все вопросы, которые появляются из базы данных, а не те, которые являются частью сеанса TestTheorique.

Итак, я хочу провести одну сессию оценки. В этой сессии есть один TestTheorique (Examid), Затем этот тест с несколькими QuestioCategorie, в котором есть несколько вопросов с ответами.

Полный код будет отправлен в течение нескольких часов.

Sumit kumar 25.10.2022 15:50

@Sumitkumar Это хорошо, я нахожу это. Вы дали мне часть ответа, который мне был нужен. Выкладываю решение.

Chrisdev 25.10.2022 15:54

Хорошо, это решено! Вот что я сделал.

В моей модели 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), у меня отобразились бы все данные сеанса, а не все вопросы, записанные в базе данных.

Очень хочу поблагодарить Сумита Кумара за помощь, он дал мне часть ответа.

Теперь я продолжаю свою разработку.

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