多对多到 MorphToMany 关系

Posted

技术标签:

【中文标题】多对多到 MorphToMany 关系【英文标题】:Many to Many to MorphToMany Relationships 【发布时间】:2020-08-22 18:08:23 【问题描述】:

我有一个 ExamQuestionTag(Spatie/laravel-tags 包)模型。

Exam 包含许多 Questions(多对多),Question 包含许多 Tags(MorphToMany)。

我想在 Exam 模型上提供一个方法,通过其关联问题获取 Exam 的所有标签,以便 $exams→tags() 返回属于该考试的关联问题的所有标签。

谁能告诉我为实现这一目标而采取的最佳途径是什么?

【问题讨论】:

【参考方案1】:

如果你有适当的描述关系,就写这样的东西:

// Exam Model

public function tags()

    return $this->questions->map(function($q)
        return $q->tags;
    )->collapse();

【讨论】:

【参考方案2】:

你可以像这样从考试中获取所有标签

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 

如果有帮助请告诉我

【讨论】:

以上是关于多对多到 MorphToMany 关系的主要内容,如果未能解决你的问题,请参考以下文章

雄辩的多对多对多 - 如何轻松加载远距离关系

Hibernate学习笔记 — 多对多关系映射

Django:通过另一个多对多关系访问多对多对象

多对多关系

多对多manytomany

(转)Hibernate框架基础——多对多关联关系映射