原则2:批处理引用其他实体的实体插入时的奇怪行为 [英] Doctrine 2: weird behavior while batch processing inserts of entities that reference other entities
问题描述
我正在尝试这里描述的批处理方法:
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);
($ 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();
}
}
问题是,第一次调用em - > flush()也$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b
是否有任何解决方法可用于这种情况?只有一个我可以做的工作是每次在循环中获取用户角色实体
谢谢
clear()
分离实体管理器管理的所有实体,因此 $ role
也是分离的,试图坚持一个独立的实体创建一个新的实体。
清除后,您应该再次获取角色:
$ this-> em-> clear();
$ role = $ this-> em-> getRepository('userRole') - > find(1);
或者只是创建一个引用:
$这 - > EM->清除();
$ role = $ this-> em-> getReference('userRole',1);
I am trying out the batch processing method described here: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html
my code looks like this
$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();
}
}
the problem is, that after the first call to em->flush() also the $role gets detached and for every 20 users a new role with a new id is created, which is not what i want
is there any workaround available for this situation? only one i could make work is to fetch the user role entity every time in the loop
thanks
clear()
detaches all entities managed by the entity manager, so $role
is detached too, and trying to persist a detached entity creates a new entity.
You should fetch the role again after clear:
$this->em->clear();
$role = $this->em->getRepository('userRole')->find(1);
Or just create a reference instead:
$this->em->clear();
$role = $this->em->getReference('userRole', 1);
这篇关于原则2:批处理引用其他实体的实体插入时的奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!