php 在Laravel中可以有多少个Model关系?

yiytaume  于 2022-10-30  发布在  PHP
关注(0)|答案(3)|浏览(178)

我试着在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。我不能显示问题,因为我没有关系。
所以我不知道我怎么能有疑问关系,我看不出我哪里出错了。
谢谢你的帮助。

mznpcxlj

mznpcxlj1#

所以为了更精确,这里正是我想要通过屏幕。
这是我的完整函数:

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)时,我有:
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。

2vuwiymt

2vuwiymt2#

好了,解决了!这就是我做的。
在我的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');
}

}
与Question建立联系,并选择response函数。在我的Question模型中,我添加了以下内容:

public function reponse()
{
    return $this->hasMany(QuestionReponse::class, 'question_id', 'id');
}

如果我执行dd($eval),我会显示所有的会话数据,而不是数据库中记录的所有问题。
我真的要感谢Sumit Kumar对他的帮助,他给了我一部分答案。
现在我继续我的开发。

pkwftd7m

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"
然后,
在您的模型中:

use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

并通过以下方式将其包含在Model类中:

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模型中:您将需要创建一些关系来访问问题,From ExamId模型,因此我们将使用QuestionCategory模型并通过它访问所有内容。
ExamId可以有多个问题类别(hasMany)
和问题类别将有多个问题(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、类别和问题。

相关问题