Ako správne použiť Nette s databázou

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

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
+
0
-

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 | 1028
+
0
-

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
+
0
-

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é.

vvoody
Člen | 910
+
0
-

Kde tam vidíš dedenie od Selection?

echo
Člen | 134
+
0
-

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
+
0
-

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.