Nette database vypisuje v šabloně ve foreach pouze poslední řádek

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

Zdravím,
v projektu používám Nette database a v šabloně se mi daří vypsat pouze poslední řádek result setu – v tracy liště se mi zobrazují u toho dotazu 2 řádky.
Model:

return $this->db->table('category')->select(':content.*, '{$src}')->where(':content.name IS NOT NULL')->order('date_added DESC');

Presenter:

$contents = // viz výše model
$this->template->contents = $contents->page($page, 10);

Šablona:

<div n:foreach="$contents as $content">
{$content->date_added}
{$content->name}...
</div>

Vidíte někdo někde nějaký problém?
Děkuju za rady.

Šaman
Člen | 2666
+
0
-

Dumpni si $contents už v presenteru, ať víš, jestli ladit získávání dat, nebo výpis. Pokud při získávání dat, tak bys měl v debug baru mít sql dotaz.

CZechBoY
Člen | 3608
+
0
-

Díky za odpověď.
Jak píšu… v tracy bar mám dotaz a vedle něj napsáno, že počet řádků resultsetu je 2.
Při dumpu $this->template->contents dostávám

Šaman
Člen | 2666
+
0
-

Tak lepší bude dumpnout ještě ->fetchAll(), tam se aspoň uvidí, jestli to obsahuje oba řádky.

CZechBoY
Člen | 3608
+
0
-

OK, $this->template->contents->fetchAll(); vyhazuje

Šaman
Člen | 2666
+
0
-

Vrací jediný záznam. Takže nemusíš řešit předávání do šablony, ale ten dotaz. S tím už ti neporadím, NDBT nepoužívám. Jestli dál nepoužíváš vazby mezi tabulkami, tak jako quickfix můžeš přepsat dotaz na $db->query(…), to je průhlednější, než NDBT.

David Matějka
Moderator | 6445
+
0
-

je problem, ze jako base tabulku uvadis ‚category‘ a pak se snazis vybrat z ‚content‘ – to ti nebude fungovat.

CZechBoY
Člen | 3608
+
0
-

Tak jak to mám udělat?
Mám databázi jako
content: content_id, name, author_id (user), slug, description, category_id (category), …
category: category_id, name, slug, type_id (type)

Chci vytáhnout prostě obsah podle kategorie nebo i bez ní (nejnovější články ze všech kategorií na homepage), k nim autora (jméno z user.username), type.html – u toho type.html nevím jestli to je šťastné řešení, ale nic jinýho mě nenapadlo. Možná by šlo hodit html typu do kategorie rovnou, stejně bude asi vazba kategorie:typy 1:1.

Hele děkuju :-)
Přepsal jsem modelovou metodu na

return $this->db->table('content')->select('content.*,REPLACE(category.type.html,?,content.src) AS html', '{$src}')->where('content.name IS NOT NULL')->order('date_added DESC');

a jede to.

Teď ještě dotaz na to vzor html u kategorie, fakt to nebude šťastný řešení. Nějaký nápady?

Editoval CZechBoY (26. 7. 2014 13:46)

David Matějka
Moderator | 6445
+
+1
-
$contents = $database->table('content')->where('category_id', $category_id);
<div n:foreach="$contents as $content">
{$content->date_added}
{$content->name}
{$content->author->name}
{$content->category->name}
{$content->category->type->foo}
</div>
CZechBoY
Člen | 3608
+
0
-

Jo to by šlo, ale radši mám způsob, že v db vytáhnu všechno a hodim si aliasy.
Nicméně jak udělat ten replace? Hodit replace do šablony?

David Matějka
Moderator | 6445
+
0
-

v db vytáhnu všechno a hodim si aliasy.

to prave neni nette\database pristup. ndbt primarne vzdy vybibira z jedne tabulky a pak efektivne joinuje tabulky dalsi

Nicméně jak udělat ten replace? Hodit replace do šablony?

yep, radeji provadej replace v sablone (nebo v presenteeru)

CZechBoY
Člen | 3608
+
0
-

Děkuju, už jsem to přepsal podle @matej21 a vše funguje :-) Díky

Snad nebude nijak extra vadit jak nette dává ty další dotazy do databáze kvůli uživateli, typu a i kategorii – takže místo 1 dotazu hází asi 4 s IN (…)
Btw jde těm 5 dalším dotazům nějak zamezit a vynutit si join?

Editoval CZechBoY (29. 7. 2014 20:49)