foreach v template u proměnné výstupu z databáze vícekrát

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

Pouzivam kod na zobrazeni dat z databaze v template:

<li n:foreach="$db->order('id')->where('day', 1)->where('NOT name', '') as $thing">
    {$thing->name}
</li>

to funguje, kdyz to ale pouziji 2×, napr.

<li n:foreach="$db->order('id')->where('day', 0)->where('NOT name', '') as $thing">
    {$thing->name}
</li>
<li n:foreach="$db->order('id')->where('day', 1)->where('NOT name', '') as $thing">
    {$thing->name}
</li>

Tak to nevyhodi zadnou chybu, jen to nic nezobrazi. Cim to je? Dekuji

Editoval simPod (28. 10. 2011 23:23)

Jan Voráček
Člen | 90
+
0
-

Čau. Předpokládám, že $db je instance Nette\Database\Table\Selection.

Určitě víš (a sám to v ukázce používáš), že restrikce jdou „lepit“ na sebe. Od toho se vyvíjí ona „nefunkčnost“ :) V prvním cyklu procházíš výsledek dotazu

SELECT * FROM tabulka WHERE (day = 0) AND (NOT name = '') ORDER BY id;

V druhém cyklu ale připojuješ další podmínky, takže se vlastně snažíš projít výsledky dotazu

SELECT * FROM tabulka WHERE (day = 0) AND (NOT name = '') AND (day = 1) AND (NOT name = '') ORDER BY id, id;

což není syntaktická chyba, ale vrátí se prostě prázdná množina dat.

simPod
Člen | 383
+
0
-

aha, jasny, chapu. Mno a je nejaky efektivni zpusob, jak udelat vice techto ruznych dotazu na DB aniz bych do template poslal 10 promenych se stejnym obsahem eg. $db1 $db2 $db3… ?

Jan Voráček
Člen | 90
+
0
-

Mně osobně se moc nelíbí ten způsob získávání dat v šabloně a do šablon si posílám už vyfiltrovaná a seřazená data, nad kterými pouze iteruji. Pokud ti ale mám odpovědět na tvou otázku, pak je tu asi jen jeden způsob, který se mi líbí ještě míň (programování do šablony prostě nepatří).

Presenter: (btw. pojmenování db je vážně hloupé – absolutně z toho nepoznáš, o jaká data jde)

$this->template->db = $database->table('tabulka')->where('NOT name', '')->order('id');

Šablona:

{var $tmpDb = clone $db}
<li n:foreach="$tmpDb->where('day', 0) as $thing">
    {$thing->name}
</li>
{var $tmpDb = clone $db}
<li n:foreach="$tmpDb->where('day', 1) as $thing">
    {$thing->name}
</li>

Editoval Jan Voráček (29. 10. 2011 14:15)

simPod
Člen | 383
+
0
-

mno, clone se mi libi diky

jak bys to udelal ty, kdyz se ti toto nelibi, jen nejak nastin

spidy
Člen | 55
+
0
-

A co to udělat jen pomocí jednoho dotazu?

<li n:foreach="$db->where('day = ? OR day = ?', 1, 2)->where('NOT name', '')->order('day, id') as $thing">
    {$thing->name}
</li>
mkoubik
Člen | 728
+
0
-

Předpokládám, že ty dva výpisy jsou oddělěný schválně, spíš bych to přesunul do presenteru nebo modelu a do šablony posílal rovnou 2 kolekce.