Doctrine2 - 类表继承

时间:2014-08-01 15:35:30

标签: symfony doctrine-orm class-table-inheritance

类表继承用于扩展Person,以允许添加Employee和Dragon。

一个人,员工和龙都可以拥有玩具。

如何建立Person,Employee,Dragon和Toys之间的联系?

类表继承的优点似乎是可以在父实体(Person)上设置关系,避免创建名为PersonToy,EmployeeToy和DragonToy的新实体。

如果可以编写代码以使$toy->setEmployee($employee)$toy->setDragon($dragon)全部起作用,内部我认为必须执行setPerson(),这将是理想的。

在另一侧可以调用$ toy-> getDragon()和$ toy-> getEmployee()并获取Dragon / Employee而不是Person

我知道实体玩具只与Person有关系,但是Person可以扩展,因此可以成为Dragon或Employee。

如果可能,如何实现?

/**
 * @Entity
 * @ORM\Table(name="perosn")
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="discr", type="string")
 * @DiscriminatorMap({"person" = "Person", "employee" = "Employee", "dragon" = "Dragon"})
 */
class Person
{
    /**
     * @ORM\OneToMany(targetEntity="Toy", mappedBy="person")
     */
    protected $toys;

}

/** 
 * @Entity 
 * @ORM\Table(name="employee")
 */
class Employee extends Person
{
    // ...
}

/** 
 * @Entity 
 * @ORM\Table(name="dragon")
 */
class Dragon extends Person
{
    // ...
}

/** 
 * @Entity 
 * @ORM\Table(name="toy")
 */
class Toy {

    /**
     * @ORM\ManyToOne(targetEntity="Person", inversedBy="toys", cascade={"persist"})
     */
    protected $person;        
}

0 个答案:

没有答案