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