我正在从 Doctrine 1.2 切换到 2.x,但遇到了一个奇怪的问题。
我有一个实体 CompositionRule,它有一个属性 $buildingBlock,指向一个 BuildingBlock 实体。
我设置了这个属性,使它指向一个现有的 BuildingBlock,我从数据库中获取它。
当我保留主对象 (CompositionRule) 时,entitymanager 会尝试创建一个新的 BuildingBlock 项目并将其插入到数据库中,而不是仅仅接受它已经存在并忽略它。
当您执行 $entity->save(); 时,我没有看到我在 Doctrine 1.2 中遗漏了什么;所有底层对象都被正确处理。
以下是我的映射/代码的一些部分:
组合规则:
<many-to-one field="buildingBlock" target-entity="BuildingBlock">
<cascade><cascade-all /></cascade>
</many-to-one>
..
public function setBuildingBlock($buildingBlock) {
$buildingBlock->addCompositionRule($this);
$this->buildingBlock = $buildingBlock;
}
BuildingBlock
<one-to-many field="compositionRules" target-entity="CompositionRule" mapped-by="buildingBlock">
<cascade>
<cascade-all />
</cascade>
</one-to-many>
public function addCompositionRule($rule) {
$this->compositionRules->add($rule);
}
最佳答案
我发现这是一个老问题,但我最近遇到了同样的问题,所以它可能会有所帮助。
它的发生是由于您的实体处于“分离”状态。您应该使用doctrine::merge() 函数来解决这个问题。
$rule = new CompositionRule;
$block = $entityManager->merge($block); //it's important to use result of function, not the same element
$entityManager->persist($role);
$entityManager->flush();
关于php - Doctrine 2 persist 尝试插入现有项目而不是更新它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6411544/