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

geo*_*ydv 7 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;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

Kam*_*mil 12

我理解这是一个老问题,但我最近遇到了同样的问题,所以它可能有所帮助.

它是由于您的实体的"分离"状态而发生的.你应该使用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();
Run Code Online (Sandbox Code Playgroud)

  • 我3年前确实问了这个问题.与此同时,我没有与Doctrine合作.我对ORM框架有了更多的了解,这看起来确实很好.我正在接受那些偶然发现这个问题的人.很高兴你解决了! (3认同)