Ako správne použiť Nette s databázou
- pseudonym
- Člen | 57
Neviem presne ako formulovať túto otázku. Keby som vedel, hádam by som si
to našiel sám. Ide o to, že v rámci nastavenia Nette s databázou som v
config.neon
vytváral akési factories
pre každú
tabuľku, ktorú mám v databáze tak, aby som s ňou potom mohol
pracovať.
Momentálne k databáze pristupujem tak, že keď chcem niečo v konkrétnom presenteri vylistovať alebo zmeniť či uložiť v databáze, tak jednoducho zavolám:
$table = $this->db->table("nazov-tabulky");
Ďalej nad premennou $table
vykonávam všetky možné operácie
od selectov cez updaty a podobne. Moja otázka znie, ako sa správne dajú
použiť napr. aj tie modely v adresári models
, ktoré som
vytváral pre každú tabuľku. Štruktúra takéhoto modelu je nasledovná:
use Nette\Database\Connection,
Nette\Database\Table\Selection;
class UserAccounts extends Selection
{
public function __construct(\Nette\Database\Connection $connection)
{
parent::__construct('userAccount', $connection);
}
}
Je mi jasné, že táto trieda tu nie je zbytočne a že by som si asi v rámci nej mal vytvoriť nejaké metódy (napr. na vrátenie mena a priezviska, poprípade na zmenu hesla v databáze a podobne) a tie potom jednoducho nejakým spôsobom použiť priamo v presenteri. Neviem sa však nijako dopátrať, ako to spraviť správne. Keď si aj tieto metódy vytvorím, ako k nim potom budem pristupovať z jednotlivých presenterov a podobne. Používam Nette version 2.0.1 released on 2012–02–29; vychádzal som z príkladu s modulmi, mám vytvorené moduly pre frontend aj pre admin časť.
Ak by ste ma niekto vedeli smerovať na kus dokumentácie, ktorý o tom hovorí, poprípade to nejako jednoducho vysvetliť. Vopred ďakujem.
- pseudonym
- Člen | 57
Z tohto som vychádzal. Možno teraz, keď sa na to pozriem po čase (po cca
pol roku) to už aj dáva zmysel. Ak som to správne pochopil, tak všetko čo
si vytvorím v triedach, ktoré mám v adresári models
(triedy,
ktoré extends Selection
) viem získať pomocou
$this->context->factory-name
, v config.neon
potom párujem factorny-name na class-name.
- jiri.pudil
- Nette Blogger | 1032
Dědit Selection není ani trochu dobrý nápad. Repozitáře by měly pracovat nad instancí Connection, kterou dostanou v konstruktoru, a při každém dotazu si říkat o nové Selection – viz quickstart. Řekl bych, že tohle je hlavní důvod, proč:
Neviem sa však nijako dopátrať, ako to spraviť správne.
Takové repozitáře pak v configu zaregistruješ jako služby, ne továrny. Přistoupit k nim můžeš přes context, a když upgraduješ na Nette >= 2.0.5, budeš si je moct do presenterů injectovat, což je mnohem víc cool.
- echo
- Člen | 134
Zdravím,
já jsem naopak názoru, že smysluplně, jednoduše a bez zbytečných iterací
lze použít Database pouze tak, že dědíš od Selection. Viz.
proof-of-concept od Fabíka https://github.com/fabik/database.
Ke všemu si stačí vyrobit interfacy a bude to i čisté.
- echo
- Člen | 134
To nemyslíš vážně. Díval jsi se na to vůbec? https://github.com/…election.php
edit: Pardon, už jsem tě pochopil. Je pravda, že Repository nedědí od Selection.
Editoval echo (16. 1. 2013 19:36)
- vvoody
- Člen | 910
Bavíme sa o repozitári ktorý je u fabrika toto:
4. Create classes for rows (e.g. Article, User) and tables (e.g. Articles, Users):
class Articles extends Table { protected $name = 'articles'; }
Keď sa pozrieš na implementáciu Table:
abstract class Table extends Object
...
Takže fabrikov model/repozitár/reprezentácia tabuľky (nehodiace sa preškrtni) určite nededí od selection. To čo si linkol je len rozšírenie selection ale určite nie základ pre repozitáre.