Laravel 我应该创建三个模型还是一个多态类型

Laravel 我应该创建三个模型还是一个多态类型,laravel,Laravel,我有一个Laravel 8应用程序,我想知道如何解决一个典型的多态问题。我有一个员工模型。该员工可以是执行员工或EntryLevel员工。将有ExecutiveEmployee拥有EntryLevel员工没有的方法,反之亦然 使用Laravel 8,是否可以创建一个基本的员工模型(没有相应的表?),然后创建从员工继承的名为ExecutiveEmployee和EntryLevel员工的两个模型?这也意味着这两种员工类型将有两个不同的数据库表,即使会有大量重叠的数据 只使用一个员工模型,并创建一个在

我有一个Laravel 8应用程序,我想知道如何解决一个典型的
多态问题。我有一个
员工
模型。该员工可以是
执行员工
EntryLevel员工
。将有
ExecutiveEmployee
拥有
EntryLevel员工
没有的方法,反之亦然

使用Laravel 8,是否可以创建一个基本的
员工
模型(没有相应的表?),然后创建从
员工
继承的名为
ExecutiveEmployee
EntryLevel员工
的两个模型?这也意味着这两种员工类型将有两个不同的数据库表,即使会有大量重叠的数据

只使用一个
员工
模型,并创建一个在模型中列出员工类型的迁移,这有意义吗?我假设,如果
EntryLevelEmployee
有一些与之相关的数据库属性,而这些属性可能与
ExecutiveEmployee
类型相关,也可能与之无关,这是正常的,还是一个错误的假设

在Laravel 8中,正确的建模方法是什么?我更喜欢把所有的东西都放在一张桌子上,因为这些模型有多相似。我必须记住,会有一方拥有另一方没有的数据。也将有不同的访问器方法

在使用多个模型时,是否可以将所有内容都放在一个
employees
表中?也就是说,如果我创建两个名为
ExecutiveEmployee
EntryLevelEmployee
的模型,它们都会查询底层表
employees

更新1


我研究得越多,就越觉得多态性是不正确的方法,我可能需要的是
单表继承
。似乎能使人口才出众。是否有充分的理由不使用此选项?

我不明白您为什么不创建简单的一对多关系。根据您提供的信息,多态关系看起来是不必要的。我认为正确的方法是创建employee_角色表和关系。然后,您可以为不同的员工类型授予不同的权限。有几种方法可以做到这一点。您可以创建一个中间件来创建路由限制。您可以在控制器中执行函数之前检查角色,并且仅在员工具有权限的情况下运行。您可以在blade中使用if-else来不渲染auth user等无法使用的部分。

如果您有不同的“类型”员工,并且每个员工类型应该有不同的逻辑,那么是的,这听起来像是多态关系。

在这种情况下,我将使用多态关系,因为你更灵活,耦合更少

使用
单表继承(STI)
,您可以在
employees
表中添加特定于类型的列,并使其
可为空。但请考虑将来添加/删除类型

executive_employees
    id - integer
    executive_specific - string

entry_level_employees
    id - integer
    entry_level_specific - string

employees
    id - integer
    name - string
    email - string
    employable_id - integer
    employable_type - string
至于STI,情况也一样

employees
    id - integer
    name - string
    email - string
    type - string
    executive_specific - nullable string
    entry_level_specific - nullable string
因此,当您没有特定类型的列时,STI是合适的。但您希望在代码中添加特定的行为。例如,用户类型(管理员、作者)

即便如此,这还是一个偏好的问题。

这实际上取决于employee对象的状态和行为

<强>以下几点我将考虑做出决定<强>

  • 如果对象的状态/属性不同,那么肯定会创建不同的模型,因为数据将存储在不同的表中
  • 如果大多数状态/属性相同,但有些不同,则可以 考虑将所有存储在一个表/模型中,并考虑到 行为创建单独的表,如has 建议您可以考虑查询范围 与数据库的事务
另一种观点是

  • 如果要创建不同的表,将创建多少个联接, 这是否会影响性能和其他方面,是否会使您的 代码复杂
  • 你能简化关系,独立处理事情吗
  • 当你制作API时,你的 代码使api工作过度?或者您需要创建太多的请求 有什么手术吗
这些东西将决定你如何做出决定

更新1:
另一点我想补充的是您想使用的包,考虑使用表中的父密钥,并且可以在单个模型中定义关系。我不认为您需要使用包,您可以自己定义它。我猜。

是否需要将
ExecutiveEmployee
EntryLeveEmployee
列在基本
用户
表中(如果有)?第二个问题(或者换句话说)每个用户(在
用户
表的情况下)是否都属于
[ExecutiveEmployee:class,EntryLeveEmployee:class]
?@Tpojka用户不是员工类型。我会这样说(我总是倾向于使用语言/技术/技术/框架推荐的命名约定)
employeeable
多态表的表格。而且,多态轴中应该保留所有的共同属性<如果需要,code>ExecutiveEmployee
EntryLevelEmployee
可以具有其属性和单独的属性子表。如果是1:1、1:n或m:n多形关系,则取决于业务逻辑。如果每种类型的员工都有3-5列特定数据,我看不出为什么不将其全部简化,只创建一个
员工
模型。以后管理起来要容易得多。但是,如果这两种类型有很多不同的信息,最好将其解耦。在我看来,使用ORM的目的是在关系数据库和OOP语言之间建立一个OOP“桥梁”,因此从这个意义上说