Doctrine2 ORM – jednou persist, entity manager jí ale nezná

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dibalaj
Člen | 40
+
0
-

Ahoj,

mám třídu „PagesFacade“:

class PagesFacade
{
  public function create(Page $entity)
  {
    $this->entityManager->persist($entity);
    $this->entityManager->flush($entity);
  }


  public function flush(Page $entity)
  {
    $this->entityManager->flush($entity);
  }
}

V presenteru pro vytvoření stránky volám $pagesFacade->create($entity). Záznam v DB se v pořádku vytvoří, vše vypadá OK. Ale jakmile si otevřu detail stránky a z formuláře uložím změny, dojde k chybě: Entity has to be managed or scheduled for removal for single computation …

Při ukládání změn volám $pagesFacade->flush($entity);

Chápu tedy špatně persitování entity, nebo je to jiná chyba? Měl jsem za to, že jakmile jednou kdekoliv v kódu zavolám persist pro novou entitu, není potřeba entityManageru znovu říkat dalším persistem, že entita existuje. Proč tedy laděnka hlásí tuto chybu?

Dík za rady.

F.Vesely
Člen | 369
+
+3
-

Nevolej flush($entity), ale jen flush().

dibalaj
Člen | 40
+
0
-

Díky za radu. Můžeš mi prosím vysvětlit, jaký je v tom rozdíl?

Azathoth
Člen | 495
+
+1
-

dibalaj napsal(a):

Díky za radu. Můžeš mi prosím vysvětlit, jaký je v tom rozdíl?

flush($entity) uloží do db pouze tu entitu, tedy poskládá insert/update/delete pouze pro entitu, kterou jsi tam poslal jako parametr (jde tam poslat i pole entit).
flush() uložít do db všechno, co je entity manageru představeno (neuloží to, co jsi nepersistoval). Je to náročnější operace, protože entity manager musí projít všechny entity, které má načtené a u každé udělat rozdíl oproti původnímu stavu.
Každé se hodí jinde.
Kde vím, že se mi jedná pouze o jednu entitu, a jsem si na 100% jist, co dělám, použiju flush($entity). Jinak používám flush().

dibalaj
Člen | 40
+
0
-

Díky za vysvětlení. Problem solved :-)