Php 原则2:批量处理引用其他实体的实体插入时的奇怪行为
我正在尝试这里描述的批处理方法: 我的代码如下所示Php 原则2:批量处理引用其他实体的实体插入时的奇怪行为,php,doctrine-orm,bulkinsert,Php,Doctrine Orm,Bulkinsert,我正在尝试这里描述的批处理方法: 我的代码如下所示 $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
$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();
}
}
$limit=10000;
$batchSize=20;
$role=$this->em->getRepository('userRole')->find(1);
对于($i=0;$i setName('name'.$i));
$user->setEmail('email'.$i.@email.blah');
$user->setPassword('pwd'.$i);
$user->setRole($role);
$this->em->persist($user);
如果($i%$batchSize)==0){
$this->em->flush();
$this->em->clear();
}
}
问题是,在第一次调用em->flush()之后
$role被分离,每20个用户就有一个具有新id的新角色
创造,这不是我想要的
对于这种情况,有什么解决方法吗?我唯一能做的就是每次在循环中提取用户角色实体
谢谢clear()
分离实体管理器管理的所有实体,因此也分离了$role
,尝试保留分离的实体将创建一个新实体
清除以下内容后,应重新获取角色:
$this->em->clear();
$role = $this->em->getRepository('userRole')->find(1);
或者只是创建一个引用:
$this->em->clear();
$role = $this->em->getReference('userRole', 1);
作为arnaud576875回答的替代方案,您可以将$user从实体管理器中分离出来,以便可以立即对其进行GC。如下所示:
$this->em->flush();
$this->em->detach($user);
编辑:正如Geoff指出的那样,这将仅分离最新创建的用户对象。因此,不建议使用这种方法。这将仅分离最新的用户,而不是进行分离的19个用户-如果我错了,请纠正我。我知道已经晚了,但是-清除()还接受一个参数,因此只清除用户实体:
$this->em->clear(\entity\User::class);