Nette Database, jak používat, vyplatí se? Problémy v začátcích

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

Ahoj,

(Nette 2.1) při bližším seznamování se s Nette Database a prvotním „wow“ efektem se teď dostávám spíše k problémům, které neumím jednoduše vyřešit. V abstraktním modelu jsem si udělal metodu get, která vypadá jednoduše

public function get($id) {
    return $this->getTable()->get($id);
}

to mi umožní v presenteru jednoduché volání

function renderDetail($id) {
    $this->template->item = ...->get((int) $id);
}

Všechno je v pořádku a super, Nette mi vybere jenom ty sloupečky, které se skutečně použijí, ale. Pokud mám vazbu 1:N a chci vypsat třeba autora položky, v šabloně pak napíšu

{$item->author->name}

A tady už se dostávám trochu k „problému“. Místo jednoho dotazu s joinem dostanu dotazy dva, to nechci. Pokud chci u položky zjišťovat další info (opět v 1:N), dostávám další a další dotazy – chci jeden.

Otázka je, jak bych to měl udělat? Mám snad do modelu vytvářet metody s názvem jako getCommon, getExtended, apod. a řešit to přes $this->getTable()->select('...'), „kde už jde "vynutit“ join":https://forum.nette.org/…dvou-tabulek ?

Nebo jak to prosím řešíte? Nejde to nějak jednoduše jinak?

Není pak rovnou jednodušší si psát ty dotazy ručně a mít kontrolu nad tím, co a jak se přesně zavolá? :-) Možná bych radši zůstal jenom u Nette Database (Dibi), ne Nette Database Table, než si komplikoval život.


Další problémy:

  • jak vypnout úplně cache? Pro Nette 2.1 jsem nenašel řešení
  • už taky někdo řešil, že pokud se upraví tabulka, cache se nepřenegeruje, ale to asi jinak řešit nejde

Editoval joe (30. 1. 2014 1:11)

honos
Člen | 109
+
0
-

Jsem přešel na dibi prave kvuli ‚nedotazenosti‘ NDB.

joe napsal(a):

Další problémy:

  • jak vypnout úplně cache? Pro Nette 2.1 jsem nenašel řešení
  • už taky někdo řešil, že pokud se upraví tabulka, cache se nepřenegeruje, ale to asi jinak řešit nejde

Pri uprave tabulky musis promazat cache nebo viz dokumentace

2k
Člen | 15
+
0
-

honos napsal(a):

Jsem přešel na dibi prave kvuli ‚nedotazenosti‘ NDB.

https://phpfashion.com/…tabase-story

romiix.org
Člen | 343
+
0
-

honos napsal(a):

Jsem přešel na dibi prave kvuli ‚nedotazenosti‘ NDB.

Všade okolo stále čítam o ‚nedotazenosti‘ NDB. V čom presne to spočíva?

NDB používam od prvého vydania bez problémov (až na pár drobností). Asi som šťastné dieťa pod Slnkom:)

David Matějka
Moderator | 6445
+
0
-

@joe:

A tady už se dostávám trochu k „problému“. Místo jednoho dotazu s joinem dostanu dotazy dva, to nechci. Pokud chci u položky zjišťovat další info (opět v 1:N), dostávám další a další dotazy – chci jeden.

to je prave koncept NDBT, polozit vice jednoduchych dotazu v konstatnim poctu, nez jeden s milion joinama, s tim nic neudelas a je to vlastne super vec :) najdes o tom nejaky clanky od Jakuba Vrany

jak vypnout úplně cache? Pro Nette 2.1 jsem nenašel řešení

jak ukazuje honos, ale pouzivej to jen pro dev, ndbt bez cache by bylo neskutecne pomaly (discovered reflection ziskava strukturu databaze)

@romiix.org:
pokud se budeme drzet toho ndb vs ndbt, tak ndb je dotazeny super, s ndbt je to horsi – obcasne problemy s cache, ktera se nechce invalidovat, obcas pokladani zbytecnych dotazu, chybejici feature (treba nemoznost v backjoinu specifikovat sloupecek, dle ktereho joinovat atd.)

joe
Člen | 313
+
0
-

Díky za info, to, že je vlastně NDB a NDBT jsem taky nevěděl, ikdyž mi ale metoda query přišla povědomá :) Tématem diskuse je tedy NDBT (Nette Database Table).

Vypnutí cache se povedlo, zřejmě jsem to někde přehlédnul a zkoušel hledat.
Přesně to jsem na develu potřeboval, protože dostat v dumpu jenom jednu vlastnost entity a divit se, proč tam je jenom jedna (?) chvíli mi trvalo v čem je problém :)

matej21 napsal(a):

to je prave koncept NDBT, polozit vice jednoduchych dotazu v konstatnim poctu, nez jeden s milion joinama, s tim nic neudelas a je to vlastne super vec :) najdes o tom nejaky clanky od Jakuba Vrany

Narazil jsem na ně, souhlasím s tím, že dotaz se pak může skládat z několika joinů najednou, ale myslím, že někdy by se to hodilo :) asi tedy není žádná možnost říct, že teď použij join místo dalšího selectu.
Takže možná je řešení, prostě neřešit to (?) a nechat to na Nette, protože ten použije nejoptimálnější dotazy.

Editoval joe (30. 1. 2014 1:09)

Eda
Backer | 220
+
0
-

Tak pokud chceš použít jednorázově join, tak můžeš přece napsat:

$selection->select('Products.*, category.name')->...;

A název kategorie se ti natáhne hned.

honos
Člen | 109
+
0
-

vvoody napsal(a):

Študoval si toto https://doc.nette.org/…ase/explorer#… ?

Asi budu muset si lamat zavity ale tu anglickou dokumentaci si budu muset proštudovat.. pekne :o)

>

NDBT je zkratka pro Nette\Database\Table

myslim?

joe
Člen | 313
+
0
-

Prozkoumal jsem anglickou dokumentaci, kde toho je trochu víc. Chápu, jakým směrem jde NDBT, podobně to fungovalo v Hibernate v Javě, když jsem naposledy zkoušel ORM.
Líbí se mi to, ikdyž si myslím, že by při uvážení programátora (nastavit to nějakou metodou) bylo vhodné použít JOIN, místo dalších selectů.

@Eda

Tak pokud chceš použít jednorázově join, tak můžeš přece napsat: …

Hrál jsem si s tím, ale buď nevím jak a nebo to je vlastnost, že pokud udělám ten select, budou se mi vybírat jenom ty sloupce, které v selectu určím – nefunguje tam ta „automatika“ a šetření toho, co se bude vybírat. Tzn, že pokud budu vybírat product.*, vyberou se mi vždy všechny sloupce z tabulky product, nefunguje na to cache (?)

Editoval joe (30. 1. 2014 20:35)

David Matějka
Moderator | 6445
+
0
-

@joe: pokud uvedes ->select(cokoliv), bude se ta cache ignorovat a vybere to, co chces.

joe
Člen | 313
+
0
-

@matej21
No právě, moc hezký by bylo, kdybych napsal table.* a ono by se to nahradilo jen těma sloupcema, co se skutečně používají, tak jako to funguje, pokud se ->select() neuvede :)

joe
Člen | 313
+
0
-

A zapomněl jsem napsat větší nevýhodu, že všechny vybrané sloupce jsou pak přímou součástí objektu,
nemůžu pak psát třeba $book->author->name, ale musím napsat $book->author_name atp.

honos
Člen | 109
+
0
-

joe napsal(a):

A zapomněl jsem napsat větší nevýhodu, že všechny vybrané sloupce jsou pak přímou součástí objektu,
nemůžu pak psát třeba $book->author->name, ale musím napsat $book->author_name atp.

Tuto uz je spise orm:

podivej zde nebo zde ci tady