2011-06-20 8 views
5

Zmieniam doktrynę z wersji 1.2 na 2.x i mam dziwny problem.doctrine 2 persist próbuje wstawić istniejące elementy zamiast ich aktualizacji

Mam podmiot CompositionRule który ma atrybut $ buildingBlock, wskazując na BuildingBlock podmiotu.

Ustawiam ten atrybut, wskazując na istniejący BuildingBlock, który pobieram z bazy danych.

Kiedy utrzymuję główny obiekt (CompositionRule), osoba upoważniona próbuje utworzyć nowy obiekt BuildingBlock i wstawić go do bazy danych, nie akceptując faktu, że już istnieje i ignorując go.

Nie widzę, czego tu brakuje, tak jak w doktrynie 1.2, gdy wykonano $ entity-> save(); wszystkie podstawowe obiekty zostały poprawnie obsłużone.

Oto niektóre części mojego odwzorowań/code:

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

Masz ten sam problem tutaj. Czy znalazłeś jakieś rozwiązanie? – Bono

+0

To samo tutaj. +1. Moje tymczasowe obejście polega na iterowaniu $ em-> getUnitOfWork() -> getScheduledEntityInsertions() i usuwaniu konkretnych obiektów ... – tiriana

Odpowiedz

10

I uderstood że to stara sprawa, ale nie miałem ten sam problem ostatnio, więc może to pomaga.

Występuje ze względu na status "odłączenia" twojej jednostki. Powinieneś użyć funkcji doctrine :: merge(), aby to naprawić.

$rule = new CompositionRule; 
$block = $entityManager->merge($block); //it's important to use result of function, not the same element 
$entityManager->persist($role); 
$entityManager->flush(); 
+2

Rzeczywiście zadałem to pytanie 3 lata temu. Tymczasem nie pracowałem z Doctrine. Wiem trochę więcej o frameworkach ORM w ogóle i to wygląda na dobrą odpowiedź. Akceptuję to dla innych osób, które natkną się na to pytanie. Cieszę się, że udało ci się to rozwiązać! – geoffreydv

Powiązane problemy