Nette Database, jak používat, vyplatí se? Problémy v začátcích
- joe
- Člen | 313
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
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
- romiix.org
- Člen | 343
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
@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
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)
- honos
- Člen | 109
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
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
@joe: pokud uvedes ->select(cokoliv)
, bude se ta cache
ignorovat a vybere to, co chces.