我有一个名为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一起使用。
答案 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)
)