Многое спрашивали о 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”}