我必须更新我的Doctrine实体以匹配(potentionaly very large)XML文件中的记录.我还必须根据XML中的数据更新ManyToMany关联.这就是我在循环中所做的事情:
ArrayCollection对象)ArrayCollection::clear())ArrayCollection::add()在子循环中调用)后循环我叫EntityManager::flush().
问题是刷新会生成大量查询,而不是一次更新/插入/删除多行.对于每个实体在查询后执行:
所以总共有305条记录在XML中我得到了915个查询(我想如果所有实体都会改变,它可能会达到1220个查询),这使得导入非常慢.
我可以在循环之前利用IdentityMap和预取实体,但仍然存在UPDATE/DELETE/INSERT查询.
我正在尝试这里描述的批处理方法:http: //docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html
我的代码看起来像这样
$limit = 10000;
$batchSize = 20;
$role = $this->em->getRepository('userRole')->find(1);
for($i = 0; $i <= $limit; $i++)
{
$user = new \Entity\User;
$user->setName('name'.$i);
$user->setEmail('email'.$i.'@email.blah');
$user->setPassword('pwd'.$i);
$user->setRole($role);
$this->em->persist($user);
if (($i % $batchSize) == 0) {
$this->em->flush();
$this->em->clear();
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,在第一次调用em-> flush()之后,$ role也会被分离,并且每20个用户创建一个带有新id的新角色,这不是我想要的
这种情况有没有可用的解决方法?只有一个我可以做的工作是每次在循环中获取用户角色实体
谢谢