代码之家  ›  专栏  ›  技术社区  ›  rkeet Aurimas

ZF2+原则2-具有类表继承的子级鉴别器

  •  0
  • rkeet Aurimas  · 技术社区  · 7 年前

    关于ZF2和原则2,以及使用鉴别器,在SO和web上提出了很多问题:如何不在父实体上声明所有子实体?尤其是当你有多个模块的时候?

    简单的回答是 discriminatorMap .条令会帮你处理的。

    下面是更长的答案。

    1 回复  |  直到 7 年前
        1
  •  1
  •   rkeet Aurimas    7 年前

    一篇关于如何在子实体而不是父实体上声明子实体的流行文章, is this one .

    然而,第2条原则自编写以来有所变化,例如 AnnotationWriter 不再存在。

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

    Class Table Inheritance 方法(与单表继承相反)是不声明鉴别器映射!(不确定这是否也适用于STI)

    我找到一张旧票 on Github 这就解释了与这个答案相同的问题,许多人仍然认为,在父母身上声明是没有意义的。看完之后,我深入到代码中,仔细地重新阅读了文档。

    引用:

    注意事项:

    这是映射实体层次结构的一部分。

    @DiscriminatorMap指定鉴别器列的哪些值将行标识为哪种类型。在上述情况下,person值将行标识为person类型,employee将行标识为由employeer类型。

    如果没有提供鉴别器映射,则自动生成该映射。

    将生成 如果没有提供。尽管如此 第一个 需要注意的事项 ,这是 @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
    {
        // ...
    }
    

    当您使用doctor 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”}