doctrine 2 persist尝试插入现有项而不是更新它们

时间:2011-06-20 13:01:56

标签: php doctrine

我正在从学说1.2转换到2.x并遇到一个奇怪的问题。

我有一个实体 CompositionRule ,它有一个属性$ buildingBlock,指向 BuildingBlock 实体。

我设置了这个属性,使其指向现有的BuildingBlock,我从数据库中获取它。

当我持久保存主对象(CompositionRule)时,entitymanager尝试创建一个新的BuildingBlock项并将其插入数据库,而不是仅仅接受它已存在并忽略它。

当你执行$ entity-> save()时,我不会在教义1.2中看到我在这里失踪的东西。所有底层对象都得到了正确处理。

以下是我的映射/代码的一些部分:

CompositionRule:

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

1 个答案:

答案 0 :(得分:11)

我明白这是一个老问题,但我最近遇到了同样的问题,所以它可能会有所帮助。

它发生在&#34;分离&#34;您的实体的状态。你应该使用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();