背景:
Pitch
可以包含多个Visual
s 。Visual
存储为Pitch
中ArrayCollection
的属性。
这里是Visual
表(visuals
),Pitch
es表(statuses_pitch
)和Doctrine创建的连接表的快速图表结果。
这里是Pitch
的相关映射信息。 Visual
没有映射回Pitch
,因为关系是单向的。
manyToMany:
visuals:
targetEntity: Visual
cascade: ['persist', 'refresh', 'remove']
fetch: EAGER
orphanRemoval: true
joinTable:
name: pitches_visuals
joinColumns:
pitch_id:
referencedColumnName: id
inverseJoinColumns:
visual_id:
referencedColumnName: id
我正在对Visual
ArrayCollection
中的Pitch
进行更改,然后调用$em->persist($pitch)
和$em->flush($pitch)
。对孩子Visual
的更改不会像我期望的那样持久保存到数据库中。
这是Pitch
对象在我坚持之前的样子。请注意,Visual
对象具有visualType
属性(映射到db中的visual_type
)。持久化时,这些不为空。
这是持久化后的数据库表。请注意,visual_type
列仍然为空,并且未保留更改。
- Through complete laziness thrown cascades all over the place, to no avail
- Changed the cascade refresh from the owning (pitch) to inverse (visual) side
- Looked through the docs to see if cascade refresh is affected specifically in a Many-To-Many relationship - I couldn't find anything concrete on this, or if there *is* a problem, how I would get around it
如何通过更改
来实现我的需求答案 0 :(得分:0)
查看EntityManager::flush
的方法签名会产生以下信息:
将已排队的对象的所有更改刷新到数据库。这有效地使托管对象的内存状态与数据库同步。如果实体明确传递给此方法,则仅同步此实体和cascade-persist语义+预定插入/删除。
看起来这并不涉及更新(级联:刷新)。
简而言之,我必须将$em->flush($entity)
更改为$em->flush()
以允许执行刷新级联。这需要一个架构重新思考,所以我没有无理由多次调用flush()
。