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