Komentáře k více typům obsahu
- Arynev
- Člen | 33
Ahoj,
je to poměrně oříšek, ale jak nejlépe navrhnou tabulky pro komentáře
k více typům obsahu?
Zatím mi asi nejschůdnější přijdou dvě varianty:
- pro každý typ obsahu vlastní komentáře
- jedna tabulka pouze s „id“ (AI) a k ní tabulka pro komentáře
- jedna tabulka pro komentáře ve které budou sloupce object enum (např „article“,„page“), object_id
Jsem spíš pro druhou variantu, teď ale nastává pravý problém. Jak vypsat seznam nejnovějších komentářů a k nim jednoduše odkazy? Samozřejmě u komentáře budu chtít zobrazit titulek.
Díky za názory, odpovědi.
- pepakriz
- Člen | 246
Co takhle vytvořit jednu tabulku pro obsah, k této tabulce potom vázat další typy obsahů a též komentáře? V Doctrine by šla udělat entita, která reprezentuje záznam k tabulce obsahu. Další Entita pro jiný typ obsahu by v konstruktoru pouze vytvořila asociaci oneToOne na obsahovou entitu a přidala by si své další sloupečky. Ve finále by existovaly tři tabulky. Obsahová, na kterou by se lepily další tabulky (Typová, která by rozšiřovala Obsahovou entitu (OneToOne) a potom komentáře, které by se lepily též na obsahovou ManyToOne).
- mkoubik
- Člen | 728
pepakriz napsal(a):
To OneToOne
je právě „zlozvyk“ z relačního návrhu.
Pohodlnější je použít dědičnost
(class Article extends Commentable
), Doctrine pak dělá
automaticky INNER JOIN
. Pak stačí vytáhnout komentáře a k nim
přiřazené commentables a linky generovat podle
$comment->commentable instanceof Article
atd.
- mkoubik
- Člen | 728
SELECT c FROM \Commentable c
, jak se to přeloží do SQL už
záleží na metodě reprezentace dědičnosti. Viz http://www.doctrine-project.org/…mapping.html.
Editoval mkoubik (29. 11. 2011 20:35)
- pepakriz
- Člen | 246
mkoubik napsal(a):
Pokud řeším modulární strukturu, tedy že nějaké CMS bude mít obecnou entitu stránky, pak dědění u Doctrine nelze použít, jelikož základní entita musí o jeho potomku vědět. A nebo mě něco uniklo? Proto jsem psal o řešení pomocí OneToOne. http://www.doctrine-project.org/…mapping.html
- Patrik Votoček
- Člen | 2221
Né nutně. Nella CMS je postavená na Class Table Inheritance. A využívá ho „do mrtě“.
Já CMS 1.x používám vlastní listenery, které tohle „obcházejí“. Nicméně díky https://github.com/…Listener.php se to dá použít o dost snadněji.
- pepakriz
- Člen | 246
Patrik Votoček napsal(a):
Nicméně díky https://github.com/…Listener.php se to dá použít o dost snadněji.
Jestli jsem ve vteřině správně pochopil účel, zařizuje mi automatické zjištění potomků. Tak to je hodně drsné, až budu mít trochu času, mrknu na to.
- Arynev
- Člen | 33
Jak to vypadá, tak přejít z Nette\Database na Doctrine je asi nejjednodušší řešení. V NotORM se to jednoduše vyřešit nedá aniž bych při procházení foreach hledal každá záznam zvlášť
Vlastně ne, já class table inheritance použil jen částečně. Ten titulek mám nacpat do commentable a je to v pořádku. Pak odstranit z ostatních tabulek id(AI) a používat pouze id z commentable. Bude to však znamenat používání triggerů.
Co když titulek budu generovat ze dvou tabulek, které jsou komentovatelné?
Editoval Arynev (30. 11. 2011 10:04)