学说 2 在 PreFlush 中获取相关实体
doctrine 2 get related entities in PreFlush
有以下实体:Zone
、ZoneRecord
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 在 ZoneRecord
和 ZoneRecordA
之间确实存在内部差异,尽管它们被标记为 JOINED 并且 ZoneRecordA
扩展了 ZoneRecord
.
如果您想删除记录,这尤其是个问题 - 现在我同时使用删除方法(Zone->removeRecord(ZoneRecordA)
和 Zone->removeRecordA(ZoneRecordA)
)来确保从 EntityManager 中删除实体。
如果您通过 addRecord()
或 addRecordA()
将实体添加到 Zone
,也会发生这种奇怪的行为,它们在刷新和重新加载之前被用作不同的集合。
圣诞快乐:)
有以下实体:Zone
、ZoneRecord
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 在 ZoneRecord
和 ZoneRecordA
之间确实存在内部差异,尽管它们被标记为 JOINED 并且 ZoneRecordA
扩展了 ZoneRecord
.
如果您想删除记录,这尤其是个问题 - 现在我同时使用删除方法(Zone->removeRecord(ZoneRecordA)
和 Zone->removeRecordA(ZoneRecordA)
)来确保从 EntityManager 中删除实体。
如果您通过 addRecord()
或 addRecordA()
将实体添加到 Zone
,也会发生这种奇怪的行为,它们在刷新和重新加载之前被用作不同的集合。
圣诞快乐:)