Iam使用Symfony(4.3)和Doctrine。当我想在脚本的构造函数中获得这样的用户时:
$userRepo = $this->em->getRepository(User::class);
$this->systemUser = $userRepo->findOneBy([
"firstName" => "system",
"lastName" => "system",
]);
例如在这样的createdBy
字段中保存对此用户的引用:
$newUser->setName("test");
$newUser->setCreatedBy($this->systemUser);
$this->entityManager->persist($newUser);
$this->entityManager->flush();
每systemUser
之后,flush()
就被保存到数据库中。
我已经尝试仅通过
获取参考。$this->systemUser = $this->entityManager->getReference(User::class, $this->systemUser->getId());
但这也不起作用。
编辑:
setCreatedBy
-方法:
public function setCreatedBy(User $user): void {
$this->createdBy = $user;
}
“ createdBy”字段:
/**
* @var User
* @ORM\ManyToOne(targetEntity="App\Entity\User", cascade={"persist"})
* @ORM\JoinColumn(nullable=true)
*/
protected $createdBy;
答案 0 :(得分:1)
您已经为该关系配置了cascade={"persist"}
选项,这意味着Doctrine将保存通过该关系找到的“新”实体。
您的问题表明createdBy
字段只能包含与现有用户的关系。这意味着cascade
在这里绝对不是必需的。这也是现有实体在您的案例中再次保留的原因。
从属性的映射配置中删除cascade
选项,以解决您的问题。
之后清除缓存。
答案 1 :(得分:0)
要回答我自己的问题:
我忘了提到我在一个循环中插入〜70.000个项目,每100行使用clear()
。问题是使用实体管理器的clear()
方法。它分离了所有由理论管理的实体,因此理论认为这些实体是新实体,并将其保存到数据库中。所以我必须这样做:
$newUser->setCreatedBy($this->em->getReference(User::class, $this->systemUser->getId()));