2017-07-10 36 views
0

许多人在SO和网络周围就ZF2与Doctrine 2以及使用鉴别器问的问题是:您如何不在父实体上声明所有子实体?特别是当你有多个模块?ZF2 + Doctrine 2 - 具有类表继承的子级别鉴别器

简短的回答是:不要申报discriminatorMap。教义会为你处理。

较长的答案在下面。

回答

0

关于如何能够声明您的孩子实体,在子实体上,而不是父母,is this one的热门文章。

然而,Doctrine 2自写入以来有所改变,例如, AnnotationWriter不再存在。

然而,这是一个更简单的方法,正如我在问题中提到的:什么也不做。

现在使用使用“Class Table Inheritance”方法(与“单表继承”相反)的鉴别器是不要声明鉴别器图! (不知道这是否也适用于STI ......)

我发现一张旧票on Github解释了同样的问题,这个答案以及许多人仍然有这个问题,那对父母宣布是没有意义的。仔细阅读后,我会仔细阅读代码并重新阅读文档。

另外,如果您在阅读文档时要小心,它说这是可能的,不要说它。

报价:

注意事项:

的@InheritanceType,@DiscriminatorColumn和@DiscriminatorMap必须最上面的类,它是映射实体层次结构的一部分来指定。

@DiscriminatorMap指定鉴别器列的哪些值将行标识为哪个类型。在上面的情况下,“person”的值将行标识为Person类型,“employee”将行标识为Employee类型。

如果这些类包含在与应用鉴别器映射的实体类相同的名称空间中,则鉴别器映射中的类名不需要完全限定。

如果未提供鉴别图,则自动生成该图。自动生成的鉴别器映射包含每个类的小写短名称作为关键字。

当然,上述片文档不明确说明的地图将会产生如果提供无。虽然它矛盾第一的事情,这就是@DiscriminatorMap必须提供在层次结构的最上面的类。因此,如果你要将你的课程扩展到几个模块(因为我假设你是这样读的),不要声明一个鉴别器映射!

我将离开你下面一个例子:

<?php 
namespace My\Namespace\Entity; 

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr", type="string") 
* // NOTE: No @DiscriminatorMap!!! 
*/ 
class Person 
{ 
    // ... 
} 


<?php 
namespace My\Other\Namespace\Entity; 

/** @Entity */ 
class Employee extends \My\Namespace\Entity\Person 
{ 
    // ... 
} 

当您使用CLI学说命令来检查你的实体,你会发现这是正确的。

此外,检查它通过使用实体检查命令完全工作:

./vendor/bin/doctrine-module orm:mapping:describe “\My\Namespace\Entity\Person” 

接近该命令的响应的顶部将是这一行:

| Discriminator map | {“person”:”My\\Namespace\\Entity\\Person”,”employee”:”My\\Other\\Namespace\\Entity\\Employee”}