多对多到 MorphToMany 关系
Many to Many to MorphToMany Relationships
我有一个考试、问题和标签(Spatie/laravel-tags包) 型号。
一个Exam
由许多Questions
(多对多)组成,Question
有许多Tags
(MorphToMany)。
我想在 Exam 模型上有一个方法来通过其相关问题获取 Exam 的所有标签,这样 $exams→tags()
returns 来自属于考试的相关问题的所有标签.
谁能告诉我实现这一目标的最佳途径是什么?
如果你有合适的描述关系,就这样写:
// Exam Model
public function tags()
{
return $this->questions->map(function($q){
return $q->tags;
})->collapse();
}
你可以从这样的考试中获得所有标签
return Exam::with('questions.tags')->get();
如果你想要标签的一些条件,你可以这样做
return Exam::with(['questions.tags'=> function($query){
$query->where('..','..')
}])->get();
如果你想像你说的那样在你的模型中使用一个合适的函数,只需将逻辑放入一个函数中。你的模型就像这样
Exam.php
public function getAllTags()
{
return $this->with(['questions.tags'=> function($query){
$query->select('..');
}])->get();
}
// This will just give you what you need
如果有帮助请告诉我
我有一个考试、问题和标签(Spatie/laravel-tags包) 型号。
一个Exam
由许多Questions
(多对多)组成,Question
有许多Tags
(MorphToMany)。
我想在 Exam 模型上有一个方法来通过其相关问题获取 Exam 的所有标签,这样 $exams→tags()
returns 来自属于考试的相关问题的所有标签.
谁能告诉我实现这一目标的最佳途径是什么?
如果你有合适的描述关系,就这样写:
// Exam Model
public function tags()
{
return $this->questions->map(function($q){
return $q->tags;
})->collapse();
}
你可以从这样的考试中获得所有标签
return Exam::with('questions.tags')->get();
如果你想要标签的一些条件,你可以这样做
return Exam::with(['questions.tags'=> function($query){
$query->where('..','..')
}])->get();
如果你想像你说的那样在你的模型中使用一个合适的函数,只需将逻辑放入一个函数中。你的模型就像这样
Exam.php
public function getAllTags()
{
return $this->with(['questions.tags'=> function($query){
$query->select('..');
}])->get();
}
// This will just give you what you need
如果有帮助请告诉我