Hints for referencing queries

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

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