Я пытаюсь использовать 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 в расширенных классах?
Ответ прямо там, в 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 {
...
Других решений пока нет …