Symfony2中继承实体的建模

时间:2014-03-09 07:55:43

标签: php symfony doctrine-orm

我有一个名为Type的实体,类型有data1,data2和data3作为属性。 我想要Type1扩展Type和Type2,它也扩展了Type

例如

Class Type
{
    private $data1;
    private $data2;
    private $data3;   
}

Class Type1 extends Type
{
    private $data4;
}

Class Type2 extends Type
{
    private $data5;
}

我想在我的Symfony实体中得到这个,这必须与Doctrine一起使用。

1 个答案:

答案 0 :(得分:1)

考虑您的示例,请使用以下Doctrine注释:

use Doctrine\ORM\Mapping AS ORM;

/**
 * @ORM\Entity
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="Type_Disc", type="string")
 * @ORM\DiscriminatorMap({"type1" = "Type1", "type2" = "Type2"})
 */
Class Type
{
    /**
    * @ORM\Column(name="data1", type="integer")
    */
    private $data1;

    /**
    * @ORM\Column(name="data2", type="integer")
    */
    private $data2;

    /**
    * @ORM\Column(name="data3", type="integer")
    */
    private $data3;   
}

/**
* @ORM\Entity
*/
Class Type1 extends Type
{
    /**
    * @ORM\Column(name="data4", type="integer")
    */
    private $data4;
}

/**
* @ORM\Entity
*/
Class Type2 extends Type
{
    /**
    * @ORM\Column(name="data5", type="integer")
    */
    private $data5;
}

作为额外信息,您需要一个称为“鉴别器列”(此处称为Type_Disc)的东西,因此ORM可以区分实体的类型。您不必将其映射到实体值,但它必须存在于您的架构中。在鉴别器映射中,您可以告诉类将哪些值映射到鉴别器列。例如,在此示例中,Type1将映射到type1中的Type_Disc。你也可以使用数字,在这种情况下它会是这样的:

 /**
 ...
 * @ORM\DiscriminatorColumn(name="Type_Disc", type="integer")
 * @ORM\DiscriminatorMap({0 = "Type1", 1 = "Type2"})
 */

请记住,模式必须是这样的,使用SQL伪语言:

CREATE TABLE Type1 (
    id int not null primary key autoincrement(1,1), /*This has to be defined somewhere in your entity*/
    Type_Disc nvarchar(50) not null,
    data1 integer not null,
    data2 integer not null,
    data3 integer not null
)

CREATE TABLE Type2 (
    id int not null primary key,
    data4 integer not null,
    foreign key (id) references Type1(id)
)

CREATE TABLE Type3 (
    id int not null primary key,
    data5 integer not null,
    foreign key (id) references Type1(id)
)