Rozkladová tabulka a insert v Nette\Database
- lunak83
- Člen | 47
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
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:
- 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
- Provedu s nimi množinové operace:
$tag_to_del = array_diff( $oldValues, $newValues );
$tag_to_add = array_diff( $newValues, $oldValues );
- 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
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
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?