Akú knižnicu použiť pri zložitých dotazoch?

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

Ahojte!

Rád by som sa opýtal skúsenejších, ako by ste v nette riešili nasledujúci problém? :

mám tabuľku užívateľov, ktorí sedia v miestnosti, majú nejaký stav, login. Všetko vo vlastných tabuľkách, ktoré sú prepojené cudzími kľúčmi:

table user
id_user PK
id_room FK
id_state FK
id_login FK
user_name

table login
id_login PK
login_name UNIQUE

table room
id_room PK
room_name

table state a login vyzerajú obdobne (ide o príklad :D, aby ste sa neplašili, čo to tam mám).

teraz, keď chcem vypísať všetky relevatné dáta, napríklad meno, miestnosť, login, robím cez dibi fluent nasledujúcu vec:

dibi::select(‚*‘)->from(‚user‘)->join(‚…‘)->using(‚…‘)→ … ->where(‚…‘)

Keď chcem napríklad zmeniť login, musím si zobrať id_login z table user, potom nájsť tento login v tabulke login a nakoniec ho upraviť. To je 1 select pre login. Pre ďalší parameter by mohol byť iný… atď. Pre úpravu usera by sa nejoinovali ostatné tabuľky.

Proste ako som začal pracovať v nette, strašne som zlenivel, nechce sa mi všetko písať, riešiť. Rád by som si vytvoril napríklad nového usera ako objekt, pričom ak by som hodnoty v tomto objekte menil, transparentne by sa prenášali a ukladali do db.

Moja otázka znie, nakoľko dibi mi v tomto zrejem nepomôže, čo použiť a ako na to ísť?
Doctrine? NotORM? Nette\Database?

Chcem jednoduché a rýchle riešenie, nechcem sa veľa učiť, už dosť, že sa s nette trápim 3 týždne :D

Ďakujem za každú radu a pomoc a prajem pekný deň.

PS: Keby niečo nebolo jasné, opíšem situáciu viac.

bazo
Člen | 620
+
0
-

tak ked chces pracovat s objektami, najlepsie bude pouzit doctrine 2. je to pohodlne, aplikacia sa ti sprehladni. a este vzdy si mozes pisat query aj rucne ci uz v dql alebo sql

xxxmisko
Člen | 140
+
0
-

bazo:

poškuloval som po nej, avšak som zmätený z návodu na planette, ako sa doctrine do nette dostáva. Je tam popísaná stará verzia, používam najnovšie nette a doctrinu asi tiež tam dám takúto. :( Prosím vedel by si mi nejako poradiť / naviesť ma, čo sa týka pridania doctrine do projektu a nahradenie za dibi, ako aj návrh samotnej konštrukcie modelu v nette? Myslím editáciu, mazanie atď.

bazo
Člen | 620
+
0
-

tak co sa tyka dostania doctrine do nette mas dve moznosti: napisat si factory alebo extension, do ktorych skopirujes ten bootstrap kod z dokuemtacie. potom mozes pouzit vrtkaov doctrine sandbox, kde uz je doctrine zaintegrovana ale prva moznost mi prijde menej magicka a aspon budes vediet preco nieco funguje tak ako funguje. tu nie je coho sa bat. hlavnym cielom je do sluzieb pridat entityManager.

co sa tyka modelu, tak pri doctrine mas 2 zakladne vrstvy: domenove objekty(entity) a repositare.

domenove objekty su vlastne obycajne objekty s doctrine anotaciami, tam si pises business logiku. v doctrine existuje pre kazdu entitu defaulty repozitar, ktory obsahuje zakladne metody ako find, findAll atd. ak chces mas custom queries, vytvoris si vlastny repository a metody si doplnis. tu mozes pouzivat queryBuilder alebo dql, sql, podla chuti. toto sa priblizuje takym klasickym modelovym triedam s pouzitim dibi.

teraz mozes pracovat rovno s entity managerom v presenteri, co ti na zaciatok odporucam. pomocou toho entity managera si vies volat dopredu definovane metody v repozitaroch, alebo tiez rovno sklada queries.

dalsia uroven je zabalit repositare do dalsej vrstvy, ktora sa ak sa nemylim san azyva fasada s tym, ze entityManager uz v presenteroch pouzivat nebudes, budes pracovat s fasadou(fasadami). ale tym by som sa teraz netrapil, kludne by som na zaciatok pouzival cisto ten entity manager.

fasady sa hodia ked chces napriklad okrem ulozenia usera do db, vyvolat nejaku udalost, poslat mail alebo cokolvek, tak to zabalis do jednej metody

ps: tu sa mozes inspirovat ako zaclenit doctrine do projektu https://github.com/bazo/Tatami projekt je sice stary asi 2 roky, ale ten princip by tam mal byt jasny

Editoval bazo (26. 3. 2013 16:39)

xxxmisko
Člen | 140
+
0
-

Ďakujem za info, nakoniec som sa rozhodol, že doctrine použijem asi až pri ďalšom projekte. Bolo by to veľa učenia sa naraz, ale určite sa na to pozriem. Ďakujem

mkoubik
Člen | 728
+
0
-

Mně přijde nejpřehlednější si všechny potřebné objekty z doctrine nadefinovat jako služby v extra souboru doctrine.neon. Nic dalšího nemusíš konfigurovat a všude si můžeš injectnout co potřebuješ. Navíc je to přehledné a můžeš si jednoduše upravovat parametry, měnit implementaci cache apod.

Stejně jako @bazo doporučuju nepoužívat v presenterech přímo repositories a už vůbec ne entity manager. Udělej si na to svoje služby a deleguj jen ty metody, které potřebuješ, jinak se z toho zblázníš.

xxxmisko
Člen | 140
+
0
-

chlapi dnes som si napísal triedu a mapovanie prvkov objektu na databázy. Zistil som, že ak joinujem 4 tabuľky, je toho dosť veľa a neviem, či toto bude schodná cesta :(
Otázka teraz na Vás znie, mkoubik, bazo, máte voľne prístupný nejaký sandbox, ktorý by mal nejaký základný best practise príklad? Myslím doctrine + ako sa to používa a kde čo písať? Proste kostru, ktorá je pre mňa najdôležitejšia, ale aj najťažšia. Strašne veľmi by ste mi pomohli a verím že nie iba mne. Ďakujem za každú reakciu páni

mkoubik
Člen | 728
+
0
-

Nějakou takovou ukázku jsem plánoval vytvořit pod https://github.com/…ik/gtd-tasks, nicméně mi na to nezbývá čas, takže tam zatím nic není. Můžeš si tam dát watch a uvidíš až tam něco pushnu, nějak extra brzo to ale asi nebude.