gpt4 book ai didi

php - Doctrine 删除实体并一次性添加一个新实体

转载 作者:行者123 更新时间:2023-12-05 05:24:05 25 4
gpt4 key购买 nike

我在 Person 和 User 之间有一个单向的 oneToOne 关系。我正在尝试执行方法 mergePeople。

public function mergePeople($personA, $personB)
{
...
$personB->setUser($personA->getUser());
$personA->setUser(NULL);
$this->em->remove($personA);
$this->em->flush();
}

但是这段代码抛出异常:

An exception occurred while executing 'UPDATE person SET last_name = ?, user_id = ? WHERE id = ?' with params ["Sanchez", 298, 47]:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '298' for key 'UNIQ_6F549197A76ED395'

我想知道为什么会出现此错误。是某种错误(在我的代码中或其他地方)还是学说不能正常处理这种情况(应该首先刷新 setUser(NULL) 更改,然后再进行其他更改)。

最佳答案

在调用 $personB->setUser() 之前,您需要先调用 $this->em->remove($personA)

EntityManager 将对映射对象执行的所有操作按照执行顺序排列。

另外,如果你先调用$personB->setSomething(),然后调用EntityManager::flush,队列的第一个语句(即$personB->setSomething()) 将被执行,使用调用 setter 时对象的状态。

如果您首先调用 $em->remove($personA),它应该是第一个执行的语句,但是您失去了在删除对象之前使用该对象的好处。

这就是为什么你应该使用类似的东西:

$user = $personA->getUser();

$personA->setUser(NULL);
$this->em->remove($personA);

$personB->setUser($user);
$this->em->flush();

并且它应该避免您关于重复输入的错误。

关于php - Doctrine 删除实体并一次性添加一个新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com