Foreach ve foreach v latte
- Andre
- Člen | 24
Přátelé, potřeboval bych vyřešit následující problém. Potřebuji v rámci výpisu vypsat objednávky a zároveň u každé z nich i vypsat její položky. Ve view mám něco takového:
{foreach $orders as $order}
<tr>
<td>
{foreach $order->items as $item}
{$item->name}
{/foreach}
</td>
</tr>
{/foreach}
Což bohužel není funkční (chyba Nette\Database\ResultSet implements only one way iterator). Nevím, jak jinak to řešit a nenapadá mě nic jiného, než že bych výpis položek objednávky vytvořil už modelu nebo presenteru, kde bych však již musel vkládat html, což samozřejmě nechci.
Doplnění: $Orders se tahá z databáze, kdy řádek odpovídá jedné objednávce, $order->items se pak tahá také z databáze, kdy řádek odpovídá jedné položce objednávky. Zhruba takto:
$sql = 'SELECT * FROM order';
$orders = $this->db->query($sql);
foreach ($orders as $order) {
$sql = 'SELECT * FROM order_item';
$order->items = $this->db->query($sql);
$return[] = $order;
}
$this->template->orders = $return;
Editoval Andre (9. 10. 2014 16:05)
- David Matějka
- Moderator | 6445
takze chapu spravne, ze nekde v modelove tride vytahnes objednavky, projdes je pomoci foreache a nasetujes jim items dalsim dotazem?
Nejsnazsi reseni bude projet vysledek fci iterator_to_array, zhruba takhle:
$orders = $this->database->query(....);
$orders = iterator_to_array($orders);
foreach(..) {
....
}
return $orders;
- David Matějka
- Moderator | 6445
Jestli to opravdu mas tak, jak si doplnil do ukazky, tak by to fungovat melo. Na jakym radku konkretne to hlasi chybu?
Ten muj kod s iterator_to_array zajisti, ze se PDO iterator prevede na pole a tudiz pres nej pude iterovat neomezene-krat