Doctrine2 ORM – jednou persist, entity manager jí ale nezná
- dibalaj
- Člen | 40
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.
- Azathoth
- Člen | 495
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().