SQL dotaz v šabloně ve foreach
- kleinpetr
- Člen | 480
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
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
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)
- kleinpetr
- Člen | 480
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
@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)