我试着在Laravel上添加模型关系。我知道我们怎么做,但我不明白,我可以链接所有我需要的模型。
这就是我的问题:
我构建了一个考试系统,它工作原理如下:
评估-〉Examid -〉问题类别-〉问题-〉响应。
因此,在评估阶段,我们选择一个包含问题类别、问题和回答的考试。
所以我写了这个:
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)的时候,所有的数据都显示了关系,但是只显示到了examcategory。我不能显示问题,因为我没有关系。
所以我不知道我怎么能有疑问关系,我看不出我哪里出错了。
谢谢你的帮助。
3条答案
按热度按时间mznpcxlj1#
所以为了更精确,这里正是我想要通过屏幕。
这是我的完整函数:
所以当我创建dd($eval)时,我有:
Evaluation Model with relation
Relation with TestTheorique
Then Relation with QuestionCategorie
Details of QuestionCategorie without the relation with Question
但我写这个是为了尝试$categories,我有我的问题与QuestionCategory和Response的关系。这是从dd($categories)的截图。
Screen of dd($categories)
Detail of QuestionCategorie
Detail of Relation from QuestionCategorie
Detail Question with Response relation
但这并不好,因为我有数据库中出现的所有问题,而不是TestTheorique会话中的问题。
因此,我想有一个评估会话。这个会话有一个TestTheorique(Examid),然后,这个测试有几个QuestioCategorie,其中有几个问题与React。
2vuwiymt2#
好了,解决了!这就是我做的。
在我的TestTheorique模型中,我把这一行修改成这样:
建立与QuestionCategorie的关系,并选择getQuestion函数。在我的QuestionCategorie模型中,我添加了以下内容:
}
与Question建立联系,并选择response函数。在我的Question模型中,我添加了以下内容:
如果我执行dd($eval),我会显示所有的会话数据,而不是数据库中记录的所有问题。
我真的要感谢Sumit Kumar对他的帮助,他给了我一部分答案。
现在我继续我的开发。
pkwftd7m3#
对于仅使用laravel/laravel包,它仅允许您访问具有hasOneThrough或hasManyThrough关系3个表
要实现你想要的或者至少我认为你在要求的东西,可以在staudenmeir/雄辩家有很多深度包的帮助下完成。
对于Laravel 8:
composer require staudenmeir/eloquent-has-many-deep:"^1.7"
对于Laravel 9:
composer require staudenmeir/eloquent-has-many-deep:"^1.7"
个然后,
在您的模型中:
并通过以下方式将其包含在Model类中:
然后在你的模型方法中根据用法做hasOneDeep或者hasManyDeep:
这可以继续下去,但记住,你必须根据结构,通过数组来提供。
参考:
https://github.com/staudenmeir/eloquent-has-many-deep
选项2:
在您的ExamId模型中:您将需要创建一些关系来访问问题,From ExamId模型,因此我们将使用QuestionCategory模型并通过它访问所有内容。
ExamId可以有多个问题类别(hasMany)
和问题类别将有多个问题(hasMany)
因此在您的ExamId模型中:
在您的问题类别模型中:
在控制器中:
现在,
$exam
将包含ExamId、类别和问题。