SQL dotaz v šabloně ve foreach

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

Zdravím,

snažím se v šabloně proiterovat related() záznamy k danému ActiveRow, akorátže při iterovaní foreachem se mi ten dotaz tak nějak sepne do jednoho. Příklad

{foreach $articles as $article}
	{foreach $article->related('article_tag') as $tag}
		{$tag->name}
	{/foreach}
{/foreach}

Dotaz je samozřejmě trochu komplikovanější a jede přes několik tabulek, ale nemyslím si, že to bude jádro problému.

Nicméně, když se teď podívám do Tracy jaký dotaz se vygeneroval, tak vidím jeden dotaz, který načte všechny tagy najednou. IN(19,20,22,25)

A problém je v tom, že když se mi u jednoho articlu vypíše třeba tag s ID 1 tak u druhého articlu se už nevypíše, ačkoli by se měl vypsat.

Když si pustím v admineru sql dotaz jen s tím rozdílem, že použiji vždy jen jedno ID articlu IN(19) Tak to funguje správně.

Nějaký tip jak bych mohl dotazy rozdělit ?

David Matějka
Moderator | 6445
+
0
-

tohle je vlastnost NDBT, aby se vyhnulo problemu 1+N dotazu. Asi bude problem s tim, ze je ten dotaz pres vice tabulek

kleinpetr
Člen | 480
+
0
-

ok napíšu tedy testovací příklad třeba se značky aut:

tabulky
- cars
- types (nákladní, osobní)
- cars_type (idCar, idType)
- garage
- cars_garage (idCar, idGarage)
- event (nějaká událost s auty)
- cars_event (idEvent, idGarageCar)

Teď iteruji událostmi a potřebuji vpsat jaké typy aut v dané události jsou tudíž data zt tabulky types

Zkusil jsem něco takového

$event->related('cars_event')->select('garageCar.car:cars_type.types.*') as $carType

Ale zde se mi právě stane, že když u prvního eventu je třeba typ nákladní a u dalšího průchodu je také nákladní, tak už se nevypíše.

Další věc je pak groupovaní těch typů, které mi taky neprojde při zapnutém only_full_group_by což nechápu, ale to bude také tím, že se selectují všchny eventy najednou v IN(…), protože když si spustím sql jen s jedním ID tak group projde v pohodě.

Editoval kleinpetr (16. 3. 2016 13:31)

David Matějka
Moderator | 6445
+
0
-

jak vypada vytvorene sql?

kleinpetr
Člen | 480
+
0
-
SELECT `cars_event`.`idEvent`, `type`.*
FROM `cars_event`
LEFT JOIN `cars_garage` `garageCar` ON `cars_event`.`idGarageCar` =
`garageCar`.`id`
LEFT JOIN `cars` ON `cars_garage`.`idCar` = `cars`.`id`
LEFT JOIN `cars_type` ON `cars`.`id` =
`cars_type`.`idCar`
LEFT JOIN `types` ON `cars_type`.`idType` =
`types`.`id`
WHERE (`cars_event`.`idEvent` IN (19, 20, 22, ...))
kleinpetr
Člen | 480
+
0
-

@DavidMatějka nějaký tip, čím by to mohlo být ? Skutečně když se jeden typ zobrazí jednou, tak už se u dalšího eventu nezobrazí. Vůbec mě nenapadá proč tomu tak je.

Když ten sql spustím, tak mi vrátí

idEvent --------- id ---------- title
19      --------- 1  ---------- osobní
20      --------- 1  ---------- osobní
20      --------- 2  ---------- nákladní
22      --------- 1  ---------- osobní
22      --------- 1  ---------- osobní

Editoval kleinpetr (17. 3. 2016 10:37)

premek_k
Člen | 172
+
0
-

Máš dobře ty joiny?

kleinpetr
Člen | 480
+
0
-

jj, ono to vrací správné výsledky, ale snažím se docílit tohohle:

Event 19
	- osobní
Event 20
	- osobní, nákladní
Event 22
	- osobní

ale místo toho dostanu

Event 19
	- osobní
Event 20
	- nákladní
Event 22
	- nic

Editoval kleinpetr (17. 3. 2016 12:34)

CZechBoY
Člen | 3608
+
0
-

SELECT GROUP_CONCAT, GROUP BY id_event

kleinpetr
Člen | 480
+
0
-

@CZechBoY sice opožděně, ale díky za tip, nicméně to stejně neřeší můj problém.. problém není v sql dotazu, ale ve výpisu v latte.

Editoval kleinpetr (8. 4. 2016 15:31)