Подтвердить что ты не робот

Наследование доктрин вложений

Можно ли использовать наследование объектов значений, встроенных в объекты доктрины?

Ситуация, о которой я думаю, такова:

У меня есть объект, который имеет и встроенный объект значения. Этот объект значения имеет следующую иерархию:

class myEntity {
    /** @Embedded(class = "baseValueObject") */
    private $value_object;
    ...
}

class baseValueObject {...}
class valueObject1 extends baseValueObject{...}
class valueObject2 extends baseValueObject2{...}

Если я определяю свой объект, чтобы baseValueObject был вложенным, ничего не происходит, когда я использую инструмент schema для обновления моей схемы db, поэтому я предполагаю, что это не способ сделать это.

Другим вариантом, о котором я сейчас думаю, является использование однонаправленного наследования для сущности для создания дочернего объекта, который использует один из объектов значения, и другого дочернего объекта для другого. Вот так:

class myEntity {
    /** @Embedded(class = "baseValueObject") */
    private $value_object;
    ...
}

class myEntityA extends myEntity {
    /** @Embedded(class = "valueObject1") */
    private $value_object;
    ...
}

class myEntityB extends myEntity {
    /** @Embedded(class = "valueObject2") */
    private $value_object;
    ...
}

class baseValueObject {...}
class valueObject1 extends baseValueObject{...}
class valueObject2 extends baseValueObject2{...}

Какой правильный подход? Возможно ли это сделать так?

4b9b3361

Ответ 1

Если вы хотите использовать свой объект Value в поле, вы должны определить новый тип в доктрине http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/custom-mapping-types.html

Если вы хотите наследовать свойства из базы, вы должны использовать @MappedSuperclass аннотацию http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html

Вы должны использовать @Embeddable, если хотите разделить объект по определенным свойствам, создав определенные объекты. Поэтому вы не можете использовать объект Value в качестве цели. Согласно документации (я не могу передать третью ссылку).

Ответ 2

Если вы хотите расширить один встраиваемый из другого, вам нужно установить свойства родителей как protected not private.

https://github.com/doctrine/doctrine2/issues/4097