Doctrine - 在ArrayCollection中对子进行更改。坚持父母。儿童的变化不会持续存在

时间:2017-01-17 10:48:14

标签: php doctrine-orm doctrine

  

背景: Pitch可以包含多个Visual s Visual存储为PitchArrayCollection的属性。

这里是Visual表(visuals),Pitch es表(statuses_pitch)和Doctrine创建的连接表的快速图表结果。

模式

enter image description here

间距

这里是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 not null

坚持

这是持久化后的数据库表。请注意,visual_type列仍然为空,并且未保留更改。

visual is null

我试过

- 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

如何通过更改

来实现我的需求

1 个答案:

答案 0 :(得分:0)

查看EntityManager::flush的方法签名会产生以下信息:

  

将已排队的对象的所有更改刷新到数据库。这有效地使托管对象的内存状态与数据库同步。如果实体明确传递给此方法,则仅同步此实体和cascade-persist语义+预定插入/删除

看起来这并不涉及更新(级联:刷新)。

简而言之,我必须将$em->flush($entity)更改为$em->flush()以允许执行刷新级联。这需要一个架构重新思考,所以我没有无理由多次调用flush()