Nette\Database vnořené related

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

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
+
0
-

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ě.

michal.lohnisky
Člen | 64
+
0
-

Super, děkuji mnohokrát.