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);