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

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

Короткий ответ : не объявлять discriminatorMap . Доктрина будет обрабатывать это для вас.

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

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

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

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

Чтобы использовать дискриминанты, используя метод « Наследование классов » (в отличие от «Наследование одиночной таблицы»), НЕ ЗАКАЗАТЬ карту Дискриминатора! (Не уверен, что это также будет работать для ИППП …)

Я нашел старый билет в Github, который объясняет ту же проблему, что и этот ответ, и что многие люди все еще имеют, что объявление на родителя не имеет смысла. Прочитав это, я встал в код и внимательно прочитал документы.

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

Цитирование:

Что нужно отметить:

@InheritanceType, @DiscriminatorColumn и @DiscriminatorMap должны быть указаны в самом верхнем классе, который является частью иерархии сопоставленных объектов.

@DiscriminatorMap указывает, какие значения столбца дискриминатора идентифицируют строку как тип какого-либо типа. В вышеприведенном случае значение «человек» идентифицирует строку как тип 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”}