我使用Doctrine v2.4.6(Symphony,如果这很重要)来处理一个复杂的项目。我遇到的问题是运行导入程序(每个文件最多处理200k行,多个文件)。我的实体是这样的:
Person
- id
- name
Address
- idaddress
- person (many-to-one Person)
- type (many-to-one Type)
- Address
Phone
- idphone
- person (many-to-one Person)
- type (many-to-one Type)
- phone
Type
- idtype
- description
(实体用XML映射)
因此,导入器进程一次读取一个文件(每个文件包含一种实体,如Person.csv,Address.csv等)并创建实体,然后存储在APCCache中。到目前为止,无法访问数据库。
第二步是按正确的顺序处理这些实体(第一个人,然后是地址,然后是电话等)。在此过程中,我检查数据库以查看它是更新还是插入。之后,我检查所有关系是否包含在EntityManager中(因为它们被缓存在APC中,诸如Type之类的关系可能会分离并且Doctrine会尝试插入它们)。然后我坚持对象,最后我冲洗对象,即$om->flush($object)
。
99%的时间可以使用,但随机手机会抛出此错误: 注意:未定义的索引:在Doctrine / ORM / Persisters / BasicEntityPersister.php第685行中的id。
当Doctrine尝试查找对象Person的关联信息时,错误会上升。在UnitOfWork中挖掘时,我注意到$uow->entityIdentifiers[spl_object_hash($person)]
的内容包含Type而不是Person的关联信息。
我真的不知道我在这里做错了什么。特别是因为它在大多数时间都有效,并且违规实体因运行而异。
我应该寻找什么?
谢谢!