【发布时间】:2021-06-05 08:06:11
【问题描述】:
我正在构建一个具有相当复杂模型的应用程序(至少对我而言)。几天来我一直在寻找解决方案,但仍然不确定我是否理解正确的写法。
我有一个名为 EscalationPolicy 的“主”模型。 该策略可以有目标(1 个或多个):团队、用户或计划(可以是每个目标中的 1 个,甚至可以是每个目标的多个,并且没有一些)。
为简单起见,我们将模型定义如下(Account 是一个父模型,它拥有多个具有 hasMany 关系的模型):
升级政策
account_id
name
"targets" (how to define this).
团队
account_id
name
用户
account_id
name
email
时间表
account_id
name
schedule_data (json)
我想要实现的是从 EscalationPolicy 轻松获取子模型,如下所示:
$escalationPolicy = EscalationPolicy::find(1); //example
$targets = $ecalationPolicy->targets
//targets should be a collection of Team, User and Schedules associated to that policy.
我尝试使用多态多对多关系,但我无法获得正确的输出。查看 Laravel 文档 (Many To Many (Polymorphic)) 中的示例,我不确定这是我想要实现的目标,因为我并没有尝试将单个(标签)模型用于多种用途(帖子、视频),而是有一个模型 (EscalationPolicy) 可以引用多个模型(用户、团队、计划)。
知道我能不能找到一种简单的方法来实现这样的事情?
提前非常感谢, ASM
【问题讨论】:
-
听起来像是多态的 M:N 关系。好吧,更准确地说是3。 EscalationPolicy 团队,EscalationPolicy 用户,EscalationPolicy 计划。您需要定义 3 个方法(针对前面提到的 3 个关系),然后定义一个仅合并 3 个集合的访问器。
-
@IGP 非常感谢!!这正是我所需要的!我已经使用 $this->morphedByMany 在 EscalationPolicy 上创建了所有 morphPivots。在 EscalationPolicy 中,我使用 $with 变量来预加载它们,如下所示:$with = ['contacts', 'teams', 'schedules']。并创建了一个访问器来调用它们并使用 collect() 返回一个集合!再次感谢!
-
不客气。很高兴这对你有用。但是,我建议您避免使用
$with属性,而是手动预先加载查询中的关系。$with经常会导致意外数量的查询。
标签: php laravel eloquent laravel-7