Nextras ORM – specifická relace k více tabulkám

dejvidecz
Člen | 1
+
0
-

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'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)

Polki
Člen | 553
+
0
-

Co zkusit dědičnost? Udělat předka, kterému bude možno nastavit obrázek?

hrach
Člen | 1834
+
0
-

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)