【问题标题】:Laravel model with multiple submodels具有多个子模型的 Laravel 模型
【发布时间】: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


【解决方案1】:

这正是多态多对多关系。

你可以这样:

升级政策

account_id
name

EscalationPoliciable

escalation_policy_id
escalation_policiable_id
escalation_policiable_type

所有其他表都一样

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多