Rozkladová tabulka a insert v Nette\Database

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lunak83
Člen | 47
+
0
-

Ahoj,

podle quickstartu jsem si připravil modely pro všechny důležité tabulky a vytvářím si pro ně v presenteru objekt v konstruktoru.

Mám ale třeba tabulku uživatelů a tabulku skupin (N:N), mezi kterými je rozkladová tabulka.
Jak se modelově řeší tahle situace při insertu, prosím?

Děkuji.

Editoval lunak83 (7. 8. 2012 23:18)

kedrigern
Člen | 102
+
0
-

Neříkám, že je to elegantní či efektivní řešení, ale já to řeším takto. Nikde nepracuji přímo se vztahem N:N, ale u jednotlivých záznamů mohu editovat vztah 1:N. Čili když třeba edituji článek, tak u něj v multiselectu mohu změnit tagy, dělám to takto:

  1. Připravím si dvě pole.
    • V prvním jsou hodnoty z DB (čili aktuálně zanesené tagy k daném článku) – $oldValues
    • V druhém poli jsou nově zadané hodnoty – $newValues
  2. Provedu s nimi množinové operace:
$tag_to_del = array_diff( $oldValues, $newValues );
$tag_to_add = array_diff( $newValues, $oldValues );
  1. No a názvy polí již napovídají. $tag_to_del je pole tagů, které se mají u daného řádku smazat. $tag_to_add jsou tagy, které se k danému článku mají přidat.
lunak83
Člen | 47
+
0
-

Ahoj,

děkuji moc za odpověď. Mně jde ale asi o trochu něco jiného, zkusím to ještě trochu rozepsat.

Dejme tomu že mám tři tabulky: uzivatel, skupina a uzivatel_ve_skupine:

uzivatel (id, name, surname)
skupina (id, name)
uzivatel_ve_skupine (id, uzivatel_id, skupina_id)

Podle Quickstartu mám připravené dva modely – jeden pracuje s tabulkou uzivatel a druhý pracuje s tabulkou skupina.

Potud je mi vše jasné a funguje mi bezvadně. Přidavat skupiny i uživatele můzu bez problému.

Nyní bych ale rád přiřadil uživatele do nějaké skupiny a tedy přidal záznam do tabulky uzivatel_ve_skupine. Pro tu ale nemám model (a takových tabulek je v databázi více).

Moje otázka tedy je jak vhodně (správně) s touto tabulkou pracovat – také pro ni vytvořit samostatný model jako podle quickstartu?

Odkaz na to jak mám model navržený je tady: https://doc.nette.org/cs/quickstart

Děkuji ještě jednou.

Elijen
Člen | 171
+
0
-

Nette nazi by tě asi opravili, že model je jen jeden. To co vytváříš jsou spíše služby (services).

Osobně bych metodu „přidej uživatele do skupiny“ dal do služby pracující s uživateli. Vytvářet samostatnou službu pro práci s relační tabulkou je IMHO nesmysl. Z objektového hlediska tě žádná relační tabulka nezajímá, proč pro ní tedy vytvářet službu?

lunak83
Člen | 47
+
0
-

Elijen napsal(a):

Z objektového hlediska tě žádná relační tabulka nezajímá, proč pro ní tedy vytvářet službu?

Právě proto jsem byl trochu zmatený a nevěděl jak bych to měl správně řešit. Nicméně takto jsem si to utřídil a mám snad jasnou představu, uvidíme :)

Děkuji!