Nextras ORM – specifická relace k více tabulkám
- dejvidecz
- Člen | 1
Ahoj, s ORM začínám a potřeboval bych poradit.
Mám tabulku images
, ve které ukládám obrázky z celé
aplikace.
Relaci v tabulce dělám pomocí dvou atributů
related_type
,related_id
Kde related_type
mi určuje, co je to za typ resp. tabulku kterou
pripojit (news,page,comment,..) a related_id určuje id toho záznamu.
Dá se tato vlastnost přenést do ORM?
Představoval bych si něco jako
Nadefinovat Images
/**
* @property int $id {primary}
* @property int $related_id
* @property string $related_type
*/
class Image extends Entity
{
}
Přidat modely News a Page, které používají obrázky.
/**
* @property int $id {primary}
* @property OneHasMany|Images[] $images {1:m Images}
*/
class News extends Entity
{
}
/**
* @property int $id {primary}
* @property OneHasMany|Images[] $images {1:m Images}
*/
class Page extends Entity
{
}
A teď bych si představil že použiji něco jako
$page = new Page();
$page->images->add(new Image());
Poté
$news = new News();
$news->images->add(new Image());
a v tabulce images se mi objevi dva zaznamy
jeden s related_type = page
a druhy s news
Samozřejmě počítám i s funkcí:
$page = $this->orm->pages->getById(2);
$page->images
vráti vše z tabulky images
kde
related_type='page'
a related_id = 2
Máte nějaký tip jak tuto funkci přenést do ORM? Nebo mám zvážit jiný DB návrh?
Děkuji všem za tipy
Editoval dejvidecz (12. 1. 2019 11:16)
- hrach
- Člen | 1838
Takovyto navrh (related_id, related_type) je velmi zasadne spatne, viz normalizace databaze; prakticky bys nemohl nastavit foreign key – constraint, ktery by ti resil na urovni db referencni integritu.
Takze ty chces pridat pro kazdy typ (News, Page) vlastni sloupec. A ty jsou treba nullable a pak muzes mit v PostgreSQL check a MySQL post trigger, ktery checkuje, ze aspon jeden z tech cizi klicu je nenulovy. To pak namodelovat v ORM neni problem.
Editoval hrach (13. 1. 2019 15:57)