tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

Vložení entity do vazby belongsToMany neuložené entitě

před 5 lety

Filip111
Člen | 244

Mám entitu Order, např.:

<?php
/*
* @property int $id
* @property OrderItems[] $items m:belongsToMany(order_id:eshop_orders_items)
*/
class Order extends BaseEntity { }
?>

Entita Order zatím není uložená, ale chtěl bych si ji připravit, tedy do $items přiřadit řádky objednávky, nastavit platbu, dopravu a další, celé to předat fasádě, která se postará o uložení.
Fasádě by mělo být jedno, jestli je objednávka uložená či nikoliv – zkrátka projde celou objednávku + řádky a uloží co bude potřeba, pošle maily atd.

Problém je, že pokud entita Order není uložená, nemůžu jí do property $items přiřadit řádky. Končí to chybou Missing entity factory in Order.
Šlo by to nějak vyřešit nebo obejít? (případně jestli na to máte jiný názor)

První se samozřejmě nabízí entitu Order hned uložit, ale to v tomto okamžiku nechci. Je to v místě, kde se se objednávka teprve připravuje, kontroluje apod. a v případě nějakého problému ji nechci ukládat.

Díky.

před 5 lety

Šaman
Člen | 2275

Tohle je nevýhoda LM, resp. jeho těsné vazby na databázi. LM tyhle věci dělá přes $row, proto ji potřebuje. Narazil jsem na to i v případě, že jsem chtěl entitu (z pohledu ER diagramu), která ale nebyla v databázi.
Kdyby se tohle mělo vyřešit bez nutnosti ukládání, tak by se musela připsat kompletní vrstva, která hlídá vazby a konzistenci už na úrovni objektu. Tu LM nemá (zároveň je to jeho výhoda – je malý a přitom stačí na 85% problémů). Všechno řeší pomocí databáze.

P.S. V ORM nad NDb to bude, předpokládám, stejné. A v YetORM taky. Jsou to poměrně jednoduché nástroje jak dostat z databáze objekty a jak objekty do databáze ukládat. Pokud by ti tohle moc vadilo, potřeboval bys velké ORM (Doctrine, ORM od Petra Procházky), kde jsou entity nezávislé na úložišti. Jsou to ale výrazně rozsáhlejší nástroje a z toho plyne i nutnost daleko větších znalostí o tom konkrétním nástroji a postupech.

Editoval Šaman (8. 11. 2014 14:02)

před 5 lety

Filip111
Člen | 244

Dík za objasnění.

Je to trochu škoda, do entity pak nejde zapouzdřit některá logika a musí se to řešit ve vyšší vrstvě.
A i tam se to komplikuje, protože nemůžu předat jeden objekt k uložení, ale musím ho rozpadnout na hlavičku, řádky a další související data tam postupně uložit a pospojovat dohromady.

S Doctrine pracuju na jednom projektu – je to ale reportovací systém, takže tohohle zásadního rozdílu, jsem si zatím nevšiml.