Hints for referencing queries
- juzna.cz
- Člen | 248
Mam prakticky stejne schema jako v predstaveni
Nette Db a stejny cyklus, jako je tam zmineno. Natahuju a vypisuju ale
1–2tis polozek ve vnejsim foreach cyklu. Vnitrni cyklus
$application->related('application_tag')
tak udela SQL dotaz
obsahujici 1–2tis. polozek v IN
klauzili a to je strasne
pomale.
Ukazka kodu:
foreach ($database->table('application')->where('authorId = ?', $authorId) as $application) { ... foreach ($application->related('application_tag') as $application_tag) { echo $application_tag->tag->name . ', '; } }
Protoze vysledku z application
bude treba 2tis, tak
$application->related()
udela
select * from application_tag where id in (1,2,3,4,5,...,2000)
, coz
je strasne dlouhy dotaz a trva strasne dlouho.
Jak takovy pripad resite vy, aby byl efektivni? Join by zrychlil nacitani dat z Db, ale zase by mi zkomplikoval vykreslovani.
Napadlo me udelat si k takove tabulce hint, pomoci ktereho by se delalo related query:
$tbl = $database->table('application')->where('authorId = ?', $authorId);
$tbl->referenceHint('application_tag', 'application.authorId = ?', $authorId); // pri volani related() pouzije tuto podminku
Pro vykresleni bych pak pouzil stejny intuitivni kod, jen misto strasne dlouheho dotazu by se udelal join podle vyse uvedene podminky, ktery je daleko rychlejsi.
Testovani na posledni verzi z gitu