学说 2 在 PreFlush 中获取相关实体

doctrine 2 get related entities in PreFlush

有以下实体:ZoneZoneRecord

ZoneRecord 有一个方法 validate() 来验证所有其他 ZoneRecord 的相关 Zone.

现在我想检查/验证每个 ZoneRecord(已经保存的 加上 Zone->addRecord(ZoneRecord) 在运行时添加的那些)如果 Zone 被保存,则与 Zone 有关。

现在我有一个 PreFlush Lifecyclecallback ZoneRecord->validate 我触发 this->getZone->getRecords() 的地方:这个方法只给我已经保存在数据库中的实体.

如何获取 Zone 的所有相关实体(从数据库保存并动态添加)?

希望我的问题够清楚了..

问题似乎出在 Doctrine 内部。 我使用 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

如果我通过 Zone->addRecordA(ZoneRecord) / Zone->removeRecordA(ZoneRecord)Zone 添加或删除 ZoneRecord,它只会从 protected $recordsa; 堆栈中删除。在成功刷新并重新加载实体之前,protected $records; 将保持不变。

似乎 Doctrine 在 ZoneRecordZoneRecordA 之间确实存在内部差异,尽管它们被标记为 JOINED 并且 ZoneRecordA 扩展了 ZoneRecord.

如果您想删除记录,这尤其是个问题 - 现在我同时使用删除方法(Zone->removeRecord(ZoneRecordA)Zone->removeRecordA(ZoneRecordA))来确保从 EntityManager 中删除实体。

如果您通过 addRecord()addRecordA() 将实体添加到 Zone,也会发生这种奇怪的行为,它们在刷新和重新加载之前被用作不同的集合。

圣诞快乐:)