原则2:批处理插入引用其他实体的实体时的奇怪行为

baz*_*azo 6 php bulkinsert doctrine-orm

我正在尝试这里描述的批处理方法: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的新角色,这不是我想要的

这种情况有没有可用的解决方法?只有一个我可以做的工作是每次在循环中获取用户角色实体

谢谢

Arn*_*anc 15

clear()分离由实体管理器管理的所有实体,因此$role也是分离的,并且尝试持久化分离的实体会创建新实体.

您应该在清除后再次获取角色:

$this->em->clear();
$role = $this->em->getRepository('userRole')->find(1);
Run Code Online (Sandbox Code Playgroud)

或者只是创建一个引用:

$this->em->clear();
$role = $this->em->getReference('userRole', 1);
Run Code Online (Sandbox Code Playgroud)