2012-12-14 9 views
7

Próba usunięcia encji bez utrzymywania innych zmian. Zauważ, że (podczas gdy w tej konkretnej sytuacji tak naprawdę nie jest to konieczne), metoda nie powinna wpływać na wynik flush() wywołanej po akcji.Doctrine2 Opróżnij pojedynczą usuniętą jednostkę

$em->remove($entity); 
$em->flush($entity); 

Który rzuca 'InvalidArgumentException' with message 'Entity has to be managed for single computation.

Mogę po prostu użyć DQL, aby usunąć; właśnie zastanawiałem się, czy istnieje sposób, aby to zrobić za pośrednictwem podmiotu zarządzającego.

+0

Wygląda błędu, jednostka, która jest usuwana w stan zarządzany. – meze

+0

@meze Tak, pomyślałem, że to możliwe. Pomyślałem również, że spłukiwanie pojedynczego obiektu jest prawdopodobnie czymś z ograniczeniami. –

+0

@meze, nie sądzę, że powyższy kod ma błąd. Jedyną niepoprawną rzeczą, którą widzę, jest fakt, że 'flush()' nie otrzymuje żadnego argumentu. – manix

Odpowiedz

2

Spróbuj tego:

  1. Odłączyć podmiot od aktualnej EM:

    $em->detach($entity); 
    
  2. Utwórz nową instancję EM i pracować z nim do usunięcia:

    $em2->remove($entity); 
    $em2->flush(); 
    

Lub możesz użyć metody clear() który jest odpowiedzialny za detach wszystkie podmioty z EM, na przykład:

$em->clear(); 
$em->remove($entity); 
$em->flush(); 
+0

Spowoduje to wypróżnienie wszystkich zmienionych elementów. – meze

+0

@ Meze, miałeś rację. Po aktualizacji – manix

+1

@manix Interesujące obejście - prostsze jest po prostu usuwanie z DQL, ale nie myślałem o stworzeniu drugiej instancji menedżera encji. –

3

zapomniałem o transactions, które będę musiał testu:

// $em instanceof EntityManager 
$em->transactional(function($em) { 
    $em->remove($entity); 
}); 

Tylko nie pewny mogę użyć transakcja, jeśli jednostki zmienione przed i po transakcji są nie w transakcji jawnej.

1

Proste rozwiązanie:

$entity = $em->manage($entity); 
// $entity now refers to the fully managed copy returned by the merge operation. 
// The EntityManager $em now manages the persistence of $entity as usual 
$em->remove($entity); 
$em->flush(); 
+1

Jest to absolutnie błędne. Przeczytaj ponownie pytanie: "TYLKO usuń pojedynczy podmiot". – nick4fake