Я пытаюсь использовать 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» абстрактным классом, чтобы избежать этого исключения.
Любой способ исправить это? Можно использовать Disccriminator в расширенных классах?
Ответ прямо в warning
сообщении!
В основном, это говорит вам, что Usuario
определен таким образом, который может привести к неприятностям. В его текущей форме этот код позволяет вам создать экземпляр Usuario
и работать с ним. Но подождите секунду. Это не определено на карте дискриминатора. Итак, что произойдет, когда вы попытаетесь его сохранить? Boom! … или, по крайней мере, это вызовет уродливое исключение.
Теперь я знаю, что вы, вероятно, даже не думали о создании Usuario
. Это просто базовый класс для Natural
и Empresa
, но Doctrine этого не знает .
Итак, как вы можете это исправить? В зависимости от ваших потребностей возможны два сценария:
Usuario
должен быть реалистичным То есть пользователи в вашем приложении могут быть экземпляром Natural
, Empresa
или просто Usuario
. Вероятно, это не так, но это может относиться к будущему читателю.
Решение: добавьте Usuario
к карте дискриминатора. Это позволит вашим пользователям быть одним из трех типов.
* ... * @ORM\DiscriminatorMap({ * "usuario" = "Usuario", * "natural" = "Natural", * "empresa" = "Empresa" * }) * ...
Usuario
не должен быть реалистичным То есть пользователи в вашем приложении могут быть либо экземпляром Natural
либо Empresa
, но никогда не Usuario
.
Решение: сделайте Usuario
abstract
классом. Это сделает невозможным создание экземпляра.
abstract class Usuario extends BaseUser { ...