Существуют следующие объекты: Zone
, ZoneRecord
ZoneRecord
имеет метод validate()
для проверки против всех других ZoneRecord
связанной Zone
.
Теперь я хочу проверить/проверить каждый ZoneRecord
(те, которые уже сохранены, плюс те, которые добавлены Zone->addRecord(ZoneRecord)
во время выполнения), который связан с Zone
если Zone
сохраняется.
Прямо сейчас у меня есть PreFlush
Lifecyclecallback ZoneRecord->validate
где я запускаю this->getZone->getRecords()
: эти методы дают мне только уже сохраненные объекты, находящиеся в db.
Как я могу получить ВСЕ связанные объекты Zone
(сохраненные из БД и динамически добавленные)?
Надеюсь, мой вопрос достаточно ясен.
Проблема, кажется, в внутренней доктрине. Я использую 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()
, они используются как разные коллекции, пока они не будут сброшены и перезагружены.
Счастливое Рождество :)