Доктрина 2 получить связанные сущности в PreFlush

1

Существуют следующие объекты: Zone, ZoneRecord

ZoneRecord имеет метод validate() для проверки против всех других ZoneRecord связанной Zone.

Теперь я хочу проверить/проверить каждый ZoneRecord (те, которые уже сохранены, плюс те, которые добавлены Zone->addRecord(ZoneRecord) во время выполнения), который связан с Zone если Zone сохраняется.

Прямо сейчас у меня есть PreFlush Lifecyclecallback ZoneRecord->validate где я запускаю this->getZone->getRecords(): эти методы дают мне только уже сохраненные объекты, находящиеся в db.

Как я могу получить ВСЕ связанные объекты Zone (сохраненные из БД и динамически добавленные)?

Надеюсь, мой вопрос достаточно ясен.

Теги:
doctrine2
lifecycle

1 ответ

0
Лучший ответ

Проблема, кажется, в внутренней доктрине. Я использую InheritanceType "JOINED".

Аннотация в Zone выглядит так:

/**
 * @var ZoneRecord[]
 * @ORM\OneToMany(targetEntity="Application\Entity\ZoneRecord", mappedBy="zone", cascade={"all"}, orphanRemoval=true)
 */
protected $records;

/**
 * @var ZoneRecordA[]
 * @ORM\OneToMany(targetEntity="Application\Entity\ZoneRecordA", mappedBy="zone", cascade={"all"}, orphanRemoval=true)
 */
protected $recordsa;

Аннотации из ZoneRecord:

/** 
 * @ORM\Entity
 * @ORM\Table(name="zonerecords")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *  "A" = "Application\Entity\ZoneRecordA"
 * })
 * @ORM\HasLifecycleCallbacks
 */
abstract class ZoneRecord

Аннотации от ZoneRecordA:

/**
 * 
 * @ORM\Entity
 * @ORM\Table(name="zonerecords_a")
 *
 */
class ZoneRecordA extends ZoneRecord

Если я добавлю или удалю ZoneRecord из Zone через Zone->addRecordA(ZoneRecord)/Zone->removeRecordA(ZoneRecord) он будет удален только из protected $recordsa; стек. protected $records; будет отключена до тех пор, пока объект не будет успешно очищен и перезагружен.

Кажется, что Doctrine делает внутренние ZoneRecord между ZoneRecord и ZoneRecordA хотя они отмечены как JOINED, а ZoneRecordA расширяет ZoneRecord.

Это особенно проблема, если вы хотите удалить записи - прямо сейчас я использую как методы удаления (Zone->removeRecord(ZoneRecordA) и Zone->removeRecordA(ZoneRecordA)), чтобы убедиться, что Entity удален из EntityManager.

Это странное поведение также возникает, если вы добавляете сущности в Zone через addRecord() или addRecordA(), они используются как разные коллекции, пока они не будут сброшены и перезагружены.

Счастливое Рождество :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню