Doctrine vracia privela dotazov pri vypise s foreach

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

Zdravim, určite len niečo robim blbo ale neviem čo. V administracii vypisijem tabulku so vsetkymi uživatelmi pomocou foreach a pozeram v paneli ze, čo riadok to novy dotaz.

https://github.com/…efault.latte

Na google som nasiel, že namiesto findBy() funkcie mam pouzit DQL, tak som skusil createQuery() a createQueryBuilder(), ale ani jedno nepomohlo.

$query = $this->em->createQueryBuilder();
			$query->select('u')
				->from(User::class, 'u');
			$query = $query->getQuery();

			$users = $query->getResult();

Hore prikladam aj ako som spravil queryBuilder, predsa ho mozno robim blbo. :D

David Matějka
Moderator | 6445
+
+1
-

Ahoj, v doctrine je 1+n problem resi sloziteji, mrkni treba na

yelidric
Člen | 33
+
0
-

Nejak mi ani po prečítani tých dvoch stránok, nie je jasne ako to riesit. Mohol by si poradit trosku viac? Diky

David Matějka
Moderator | 6445
+
+4
-

v sablone mas ->getRoles() a doctrine to neumi optimalizovat a tak provadi dotaz na ziskani roli u kazdeho jednotliveho uzivatele.

To, co chces, je nacist je ihned pro vsechny uzivatele. Bude to vypadat zhruba takto:

$qb = $this->em->createQueryBuilder();
$qb->select('u')
	->from(User::class, 'u');
$query = $qb->getQuery();

$users = $query->getResult();

$ids = array_map(function (User $user) { return $user->getId(); }, $users);

$rolesQb = $this->em->createQueryBuilder();
$rolesQb->select('partial u.{id}')
	->from(User::class, 'u');
$rolesQb->leftJoin('u.roles', 'role');
$rolesQb->addSelect('role');

//tahle podminka v tomhle konkretnim pripade potreba neni, jelikoz vyse vybiras vsechny usery.
//pokud bys ale vybiral jen nektere uzivatele, tak je potreba to nacist pouze pro ne
$rolesQb->andWhere('u.id IN (:ids)')
	->setParameters('ids', $ids);


$rolesQb->getQuery()->getResult();

Prakticky by stacilo i jednoduse tohle

$qb = $this->em->createQueryBuilder();
$qb->select('u')
	->from(User::class, 'u');
$qb->leftJoin('u.roles', 'role');
$qb->addSelect('role');
$query = $qb->getQuery();

$users = $query->getResult();

Problem je, ze ve vysledku z DB by se duplikovaly informace o uzivateli takze optimalnejsi je to reseni nad tim

yelidric
Člen | 33
+
0
-

okej dakujem, takto mi to staci… :) a lubi sa mi aj to tvoje vysvetlenie :)

CZechBoY
Člen | 3608
+
0
-

@DavidMatějka Jak by se to řešilo pro víc uživatelů? Narážím na podmínku IN – to asi dělá druhej dotaz – třeba Oracle má omezení na maximální počet položek v IN (1024), třeba pro exporty se tohle nehodí.

Svaťa Šimara
Člen | 98
+
0
-

@CZechBoY Exporty? DQL/SQLka + hydratace skalárů