我必须更新我的Doctrine实体以匹配(潜在非常大的)XML文件中的记录。我还必须根据XML中的数据更新ManyToMany关联。这是我在循环内部所做的事情:
问题是刷新会生成大量查询,而不是一次性更新/插入/删除多个行。对于每个实体执行以下查询:
我可以利用IdentityMap并在循环之前预取实体,但仍然存在UPDATE / DELETE / INSERT查询。如果上述方法不正确,我应该如何解决这个问题?
- 从XML获取数据
- 从数据库获取实体(如果不存在则创建新实体)
- 设置新实体属性
- 获取当前实体关联(getter返回ArrayCollection对象)
- 清除所有关联(通过调用ArrayCollection :: clear())
- 设置新关联(通过在子循环中调用ArrayCollection :: add())
- 通过EntityManager持久化实体
问题是刷新会生成大量查询,而不是一次性更新/插入/删除多个行。对于每个实体执行以下查询:
- SELECT以从数据库获取实体
- UPDATE以更新实体属性(目前跳过此步骤,因为尚未更改属性...)
- DELETE以清除先前的关联
- INSERT以插入新关联
我可以利用IdentityMap并在循环之前预取实体,但仍然存在UPDATE / DELETE / INSERT查询。
- 有没有办法让flush方法更好地优化查询(使用multi-insert,WHERE IN而不是多个DELETE查询等)?
- 这是刷新方法的正常行为还是我做错了什么?
- 也许我更新实体关联的方式存在问题。是否有更好的方法来解决此问题? (而不是“获取/清除/添加”方法)
- 我知道Doctrine不适用于大规模批处理,但我认为将其用于XML导入是避免使用非ORM方法可能出现的数据库不一致性的最佳方法。是这样吗?