ZF2 + Doctrine 2 - Дискриминаторы на уровне детей с наследованием таблиц классов

В SO и во всем Интернете много говорится о ZF2 с Doctrine 2 и использовании дискриминаторов: как не объявить все дочерние сущности в родительской сущности? Особенно, когда у вас есть несколько модулей?

Короткий ответ: не объявляйте discriminatorMap, Доктрина справится с этим за вас.

Более длинный ответ ниже.

1 ответ

Решение

Это популярная статья о том, как иметь возможность объявлять ваши дочерние сущности в дочерних сущностях, а не в родительской.

Однако Доктрина 2 несколько изменилась с момента ее написания, например,AnnotationWriterболее не существует.

Однако, как я уже упоминал в этом вопросе, существует более простой способ: ничего не делать.

Теперь использовать дискриминаторы с использованием метода " Наследование таблиц классов" (в отличие от "Наследования отдельных таблиц") означает НЕ ОБЪЯВЛЯТЬ карту дискриминатора! (Не уверен, что это также будет работать для ИППП...)

Я нашел старый билет на 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
{
    // ...
}

Когда вы используете команду командной строки doctrine для проверки ваших сущностей, вы обнаружите, что это правильно.

Также проверьте, что он полностью работает, используя команду проверки сущности:

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

В верхней части ответа этой команды будет следующая строка:

| Discriminator map | {“person”:”My\\Namespace\\Entity\\Person”,”employee”:”My\\Other\\Namespace\\Entity\\Employee”}
Другие вопросы по тегам