Использование дискриминатора в сущности, которая расширяет другую

Я пытаюсь использовать Discriminator в сущности, которая простирается от другого. Это код, который я сделал:

/**
* @ORM\Entity
* @ORM\Table(name="usuarios_externos.usuarios", schema="usuarios_externos")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({
*     "natural" = "Natural",
*     "empresa" = "Empresa"* })
* @UniqueEntity(fields={"correo_alternativo"}, message="El correo electrónico ya está siendo usado.")
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
*/
class Usuario extends BaseUser {
....
}

Но я получаю эту ошибку при запуске команды doctrine:schema:validate:

Объект [Doctrine \ ORM \ Mapping \ MappingException] ‘UsuarioBundle \ Entity \ Usuario’ должен быть частью карты дискриминатора
«UsuarioBundle \ Entity \ Usuario» для правильного отображения в
иерархия наследования. В качестве альтернативы вы можете сделать
‘UsuarioBundle \ Entity \ Usuario’ абстрактный класс, чтобы избежать этого
исключение из происходящего.

Есть ли способ это исправить? Можно ли использовать Discriminator в расширенных классах?

10

Решение

Ответ прямо там, в warning сообщение!

По сути, это говорит вам, что Usuario определяется таким образом, что может привести к неприятностям. В своем текущем виде этот код позволяет вам сделать экземпляр Usuario и работать с этим. Но подожди секунду. Это не определено в карте дискриминатора. Итак, что произойдет, когда вы попытаетесь сохранить это? Boom!… или, по крайней мере, это вызовет ужасное исключение.

Теперь я знаю, что вы, вероятно, даже не думали о создании Usuario, Это просто базовый класс для Natural а также Empresa, но Доктрина этого не знает.

Итак, как вы можете это исправить? Есть два возможных сценария в зависимости от ваших потребностей:

Usuario должен быть инстанцируемым

То есть пользователи в вашем приложении могут быть экземпляром Natural, Empresa или просто Usuario, Это, вероятно, не так, но это может относиться к будущему читателю.

Решение: добавлять Usuario на карту дискриминатора. Это позволит вашим пользователям быть одним из этих трех типов.

 * ...
* @ORM\DiscriminatorMap({
*     "usuario" = "Usuario",
*     "natural" = "Natural",
*     "empresa" = "Empresa"* })
* ...

Usuario должен не быть инстанцируемым

То есть пользователи в вашем приложении могут быть экземпляром Natural или же Empresa, но никогда Usuario,

Решение: делать Usuario abstract учебный класс. Это сделает невозможным его создание.

abstract class Usuario extends BaseUser {
...
28

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]