Nette\Database vnořené related

- michal.lohnisky
 - Člen | 64
 
Ahoj,
používám Nette 2.0.5.
Mám následující šablonu (proměnná $rooms je typu Selection):
{snippet}
{define #rowData}
	{if $reservation_room !== FALSE}
		{* ID se vypise vzdy, to je v poradku *}
		{$reservation_room->id}
		{* tento foreach se provede pouze poprve, jen pro prvni radek a prvni sloupec tabulky *}
		{foreach $reservation_room->related('reservation_room_guest') as $reservation_room_guest}
			{$reservation_room_guest->guest->surname}
		{/foreach}
	{/if}
{/define}
<table class="grid">
	<tbody>
		<tr n:foreach="$rooms as $room">
			<td>
				{include #rowData, reservation_room => $room->related('reservation_room')->where('departure', $date)->fetch()}
			</td>
			<td>
				{include #rowData, reservation_room => $room->related('reservation_room')->where('arrival', $date)->fetch()}
			</td>
		</tr>
	</tbody>
</table>
{/snippet}
Problém je v bloku #rowData. Jako parametr mu předávám vždy jiný ActiveRow. Id tohoto se vypíše v pořádku vždy, když jsou v DB data. Foreach, který má vypsat příjmení guesta se však provede jen poprvé.
Laděnka:
SELECT id, name, room_type_id
FROM room
(4) vyberou se 4 radky tabulky
SELECT id, room_id
FROM reservation_room
WHERE (reservation_room.room_id IN (1, 2, 3, 4)) AND
(departure = ‚2012–09–22 00:00:00‘)
(1) vyber pro prvni sloupec
SELECT id, reservation_room_id,
guest_id
FROM reservation_room_guest
WHERE (reservation_room_guest.reservation_room_id
IN (267))
(1) vztah M:N
SELECT id, surname, firstname,
company_id, street, zip,
city, country_id
FROM guest
WHERE (id IN (1))
(1) vsechna prijmeni pro prvni radek a prvni sloupec se vyberou v poradku
SELECT id, room_id
FROM reservation_room
WHERE (reservation_room.room_id IN (1, 2, 3, 4)) AND
(arrival = ‚2012–09–22 00:00:00‘)
(1) vyber pro druhy sloupec – zde se sice vybere jeden zaznam, ale
zadny select z reservation_room_guest uz nenasleduje
Kde mám chybu? Když jsem data vybíral ne v komponentě, stačilo mi za
řádek $reservation_room->id vybrat z databáze řádek
s tímto IDčkem a přiřadit ho zpět do $reservation_room (tedy
došlo jakoby k naklonování ActiveRow). Pak vše fungovalo v pořádku.
Editoval michal.lohnisky (22. 9. 2012 19:06)

- pawouk
 - Člen | 172
 
Nejsem si jistý proč ti to nefunguje, ale rozhodně bych to udělal uplně jinak. A to přez komponenty:
<table class="grid">
        <tbody>
                <tr n:foreach="$rooms as $room">
                        <td>
                                {control departure-$room->id}
                        </td>
                        <td>
				{control arrival-$room->id}
                        </td>
                </tr>
        </tbody>
</table>
Na tvém řešení se mi hlavně nelíbí že programuješ v šabloně.