【发布时间】:2020-10-12 19:05:10
【问题描述】:
我有一个 Laravel 8 应用程序,我想知道如何解决典型的 polymorphic 问题。我有一个Employee 模型。该员工可以是ExecutiveEmployee 或EntryLevelEmployee。 ExecutiveEmployee 将有一些 EntryLevelEmployee 没有的方法,反之亦然。
使用 Laravel 8,是否可以创建一个基本的 Employee 模型(没有对应的表?),然后创建两个名为 ExecutiveEmployee 和 EntryLevelEmployee 的模型,它们继承自 Employee?这也意味着两种员工类型都有两个不同的数据库表,即使会有很多重叠的数据。
只拥有一个Employee 模型并创建一个模型中列出了员工类型的迁移是否有意义?我假设EntryLevelEmployee 有一些与它相关的数据库属性可能与ExecutiveEmployee 类型相关也可能不相关,或者这是一个不正确的假设?
在 Laravel 8 中建模的正确方法是什么?我更喜欢把所有东西都放在一张桌子上,因为这些模型非常相似。我确实必须记住,会有一个人拥有而另一个人没有的数据。也会有不同的访问器方法。
是否可以在使用多个模型时将所有内容都放在一个 employees 表中?意思是,如果我创建两个名为 ExecutiveEmployee 和 EntryLevelEmployee 的模型,它们都会查询基础表 employees?
更新 1
我研究得越多,我就越认为多态在这里是不正确的方法,我可能需要的是Single-Table Inheritance。 This package 似乎为 Eloquent 带来了这种能力。有充分的理由不使用它吗?
【问题讨论】:
-
ExecutiveEmployee和EntryLevevEmployee是否需要在基本的users表中出现(如果有的话)?第二个问题(或换句话说)每个用户(在users表的情况下)是否都是[ExecutiveEmployee:class, EntryLevevEmployee:class]中的一个? -
@Tpojka 用户不是员工类型。
-
我会去(我总是倾向于使用语言/技术/技术/框架推荐的命名约定)
employeeable多态表的表。而且,在那个多态枢轴中应该保留所有相互属性。ExecutiveEmployee和EntryLevelEmployee可以有它们的属性,如果需要,可以有单独的属性子表。是否应该是 1:1、1:n 或 m:n 多态关系取决于业务逻辑。 -
如果每种类型的员工都有 3-5 列特定数据,我不明白为什么不将其全部简化并只制作一个
Employee模型。以后管理起来要容易得多。但如果这两种类型有很多不同的信息,最好解耦。 -
在我看来,使用 ORM 的目的是在关系数据库和 OOP 语言之间建立一个 OOP“桥梁”,所以从这个意义上说,如果为两者创建一个基类是有意义的其他类(即您想定义其他类将继承的基本行为)然后创建一个基类是正确的。
标签: laravel