Doctrine vracia privela dotazov pri vypise s foreach
- yelidric
- Člen | 33
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
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