许多人在SO和网络周围就ZF2与Doctrine 2以及使用鉴别器问的问题是:您如何不在父实体上声明所有子实体?特别是当你有多个模块?ZF2 + Doctrine 2 - 具有类表继承的子级别鉴别器
简短的回答是:不要申报discriminatorMap
。教义会为你处理。
较长的答案在下面。
许多人在SO和网络周围就ZF2与Doctrine 2以及使用鉴别器问的问题是:您如何不在父实体上声明所有子实体?特别是当你有多个模块?ZF2 + Doctrine 2 - 具有类表继承的子级别鉴别器
简短的回答是:不要申报discriminatorMap
。教义会为你处理。
较长的答案在下面。
关于如何能够声明您的孩子实体,在子实体上,而不是父母,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”}