Nette database příliš mnoho queries

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

Zdravím programuju svůj první web v nette. Chci se zeptat mám stránku kde vypisuji objednávky ktere uživatel provedl a při rozkliknuti objednávky vidí jake produkty si objednal. Na začátku mam foreach pro vypsani objednávek a v tom foreach mam další foreach na vypsání produktu. No problem je v tom že mám cca 10 objednávek v každem více než dva produkty tim pádem na stránce je prováděno cca 58 queries což je podle kamoše co programuje v PHP strašně moc. Chci se zeptat jestli by bylo nějak možne pomoci nette database toto zmenčit popřipadě jak? Zde přidávám kod.

{foreach $neco as $neco}
....
.....
{foreach $sluzby->VypsatObjednavkySluzby($objednavka->id) as $sluzba}
        <tr>
            <td><img src="{$basePath}/img/sluzby/ikonky/{$sluzba->sluzby->obrazek}.png" class="img-rounded" width="20" height="20"></td>
            <td style="text-align: left">{$sluzba->sluzby->nazev}</td>
            <td style="text-align: center">{$sluzba->sloty} slotů</td>
            <td style="text-align: center;width: 80px">{$sluzba->obdobi} měsíc</td>
            <td style="text-align: center">{$sluzba->cena} Kč</td>
            <td style="text-align: center">{$sluzba->sleva} %</td>
        </tr>
{/foreach}
......
......
{/foreach}

Model

public function VypsatObjednavkySluzby($id){
    return $this->findAll()->where(array('id_objednavky' => $id));
}

Vím že určitě budu k smichu :D Ale začínám takže bych ocenil rady a ne výsměchy diky :)

Šaman
Člen | 2666
+
0
-

A po znovunačtení jich je kolik? Nette\Database docela dobře cachuje. Takže poprvé proběhne spousta dotazů, ale podruhé už ví, na co se ta stránka ptá a dotazy optimalizuje.

David Matějka
Moderator | 6445
+
0
-

tohle ani nette\database nezoptimalizuje :) musis pouzit $sluzby->related(…) viz https://doc.nette.org/cs/database

t0x1c
Člen | 151
+
0
-

Po znovu načtení je jich stále 58.

Šaman napsal(a):

A po znovunačtení jich je kolik? Nette\Database docela dobře cachuje. Takže poprvé proběhne spousta dotazů, ale podruhé už ví, na co se ta stránka ptá a dotazy optimalizuje.

t0x1c
Člen | 151
+
0
-

Nechápu přesně co to related dělá. Já potřebuju vytahnout z tabulky služby dané objednávky podle id.

matej21 napsal(a):

tohle ani nette\database nezoptimalizuje :) musis pouzit $sluzby->related(…) viz https://doc.nette.org/cs/database

David Matějka
Moderator | 6445
+
0
-

jo oprava, u tebe to asi bude

foreach($objednavky as $objednavka) {
...
	foreach($objednavka->related('sluzba') /* nebo sluzby, nevim, jak se ta tabulka jmenuje*/ as $sluzba) {
		...
	}
}

to vybere vsechny sluzby pro danou objednavku – vezme to tabulku ‚sluzba‘ respektive ‚sluzby‘ (nevim jak to tam mas) a koukne kterej cizi klic ukazuje na ‚objednavka‘ a podle toho to vybere, s tim rozdilem, ze zna vsechny objednavky takze to polozi dotaz ve stylu SELECT * FROM sluzba WHERE id_objednavka IN(1,2,3,4,4).. koukni se v tej dokumentaci na ten obrazek na tabulku book_tag a jak je to tam pouzito

Editoval matej21 (17. 3. 2013 14:56)

t0x1c
Člen | 151
+
0
-

No jo ale ja mam tabulku objednavky a tabulku sluzby_objednavky a v te tabulce sluzby_objednavky ma kazda objednavka sloupecek id_objednavky a podle toho priřazuju službu k objednavce.

David Matějka
Moderator | 6445
+
0
-

jestli to teda chapu, mas tabulky objednavky, sluzby a sluzby_objednavky, jo?
tak je to v podstate uplne stejnej pripad jako v dokumentaci s tagama:

foreach($objednavky as $objednavka) {

	foreach($objednavka->related('sluzby_objednavky') as $sluzbyObjdnavky) {
		{var $sluzba = $sluzbyObjednavky->sluzby}
		...
	}
}
t0x1c
Člen | 151
+
0
-

Nene mam tabulky objednavky kde je cena celkem atd.. a sluzby_objednavky kde jsou objednane sluzby ke kazde objednavce. No a ja teda potrebuju vypsat ke kazde objednavce z tabulky objednavky vsechny sluzby ktere si objednali v tabulce sluzby_objednavky kde jsou sluzby ktere byly objednane prirazene tak ze maji sloupeček a tam id te objednavky ke ktere patří.

enumag
Člen | 2118
+
0
-

@t0x1c: Dle mého názoru @matej21 napsal přesně to co potřebuješ. Pokud myslíš že ne, mohl bys ukázat strukturu db?