Php 将Symfony和条令中的现有实体转换为后代实体

Php 将Symfony和条令中的现有实体转换为后代实体,php,oop,inheritance,symfony,doctrine-orm,Php,Oop,Inheritance,Symfony,Doctrine Orm,我有一个类员工扩展人。 随着时间的推移,已经存在的人员可以成为公司的员工 我知道使用原始SQL更改鉴别器类型或使用模糊的PECL扩展进行类型转换是一种不好的做法 但是有没有一种设计模式来管理这些复杂的问题呢 克隆所有属性和关系(个人与其他实体有许多关系)的唯一方法是实现这一点吗?我如何克隆现有的人及其所有关系?克隆数据是个坏主意。记住:如果你在复制某样东西,那你就是做错了:) 我认为最好的解决方案是根本不使用继承。只需在Person实体中创建一个新列,名为eg.type,它将是一个常量。 在该实

我有一个
类员工扩展人
。 随着时间的推移,已经存在的
人员
可以成为公司的
员工

我知道使用原始SQL更改鉴别器类型或使用模糊的PECL扩展进行类型转换是一种不好的做法

但是有没有一种设计模式来管理这些复杂的问题呢


克隆所有属性和关系(个人与其他实体有许多关系)的唯一方法是实现这一点吗?我如何克隆现有的人及其所有关系?

克隆数据是个坏主意。记住:如果你在复制某样东西,那你就是做错了:)

我认为最好的解决方案是根本不使用继承。只需在Person实体中创建一个新列,名为eg.
type
,它将是一个常量。 在该实体中,放置如下内容:

class Person
{
    const TYPE_USER = 0 ;
    const TYPE_EMPLOYEE = 1 ;
    const TYPE_BIG_FAT_BOSS = 2 ;
    ...

    /**
    * @ORM\Column(type="integer")
    */
    protected $type = self::TYPE_USER ;

这样,您只需更新
类型
列,就可以拥有更好的功能。

克隆数据是个坏主意。记住:如果你在复制某样东西,那你就是做错了:)

我认为最好的解决方案是根本不使用继承。只需在Person实体中创建一个新列,名为eg.
type
,它将是一个常量。 在该实体中,放置如下内容:

class Person
{
    const TYPE_USER = 0 ;
    const TYPE_EMPLOYEE = 1 ;
    const TYPE_BIG_FAT_BOSS = 2 ;
    ...

    /**
    * @ORM\Column(type="integer")
    */
    protected $type = self::TYPE_USER ;

这样,您只需更新
类型
列,就可以获得更好的功能。

由于
人员
员工
是两个不同的“东西”,您应该创建一个员工实体,并与该人员实体建立一对一的关系。这意味着员工始终是个人,但个人不一定是员工

class Employee
{
    /**
     * @ORM\OneToOne(targetEntity="Acme\PersonBundle\Entity\Person", cascade={"persist"})
     * @ORM\JoinColumn(referencedColumnName="id", nullable=true)
     */
    protected $person;
}
这不仅允许您使用Person实体的所有现有属性保留Person实体,防止必须克隆数据(这从来都不是一个好主意),而且最重要的是将这两种对象类型分开


正如@Zeljko提到的,您可以创建一个类型字段,但我相信我规范化数据的方法要干净得多。如果需要多种类型的员工,则可以创建EmployeeType表,然后在员工实体中具有EmployeeType_ID。此方法比使用常量更简洁,因为常量往往会变得凌乱且难以维护。

由于
Person
Employee
是两个不同的“东西”,因此您应该创建一个与Person实体具有一对一关系的Employee实体。这意味着员工始终是个人,但个人不一定是员工

class Employee
{
    /**
     * @ORM\OneToOne(targetEntity="Acme\PersonBundle\Entity\Person", cascade={"persist"})
     * @ORM\JoinColumn(referencedColumnName="id", nullable=true)
     */
    protected $person;
}
这不仅允许您使用Person实体的所有现有属性保留Person实体,防止必须克隆数据(这从来都不是一个好主意),而且最重要的是将这两种对象类型分开


正如@Zeljko提到的,您可以创建一个类型字段,但我相信我规范化数据的方法要干净得多。如果需要多种类型的员工,则可以创建EmployeeType表,然后在员工实体中具有EmployeeType_ID。这种方法比使用常数更干净,因为常数往往会变得杂乱无章,难以维护。

谢谢。最初我们有一个OneTone关系,但重构后我们认为继承听起来更符合逻辑。看起来像是一个员工扩展了一个人,但在这个设置中它不工作,你可以更改类型。谢谢你的提示!谢谢最初我们有一个OneTone关系,但重构后我们认为继承听起来更符合逻辑。看起来像是一个员工扩展了一个人,但在这个设置中它不工作,你可以更改类型。谢谢你的提示!