Kdyby\Doctrine – join nefunguje jak má
- BuGeR
- Člen | 45
Dobrý den,
používám Kdyby\Doctrine a snažím se přes QueryBuilder
vytáhnout data z tabulky Site
prostřednictvím tabulky
UserPermission
.
Entita UserPermission obsahuje:
/**
* @ORM\ManyToOne(targetEntity="Model\Entities\Site")
* @ORM\JoinColumn(name="site_id", referencedColumnName="id", nullable=false)
*/
protected $site;
Když se potom snažím v UserPermissionRepository spustit něco takového:
$qb = $this->createQueryBuilder('up');
$qb->select('s');
$qb->innerJoin('up.site', 's');
$qb->andWhere(...)
Tak to vyhodí exception.
Cannot select entity through identification variables without choosing at least one root entity alias
Dále jsem si všiml, že když to skládá ten dotaz, tak použije:
INNER JOIN up.site s
Přitom tam chybí ON, prostřednictvím kterého vybere sloupce, které tabulky propojují.
Nevíte prosím, co dělám špatně?:-)
Děkuji,
- Martk
- Člen | 661
$qb->select('s');
Vybíráš jen pole entit joinutých a v doctrině to nelze, musíš mít v selectu i root entitu up, jestli tento dotaz myslíš vážně, tak to udělej takto:
$qb = $this->createQueryBuilder('s');
$qb->innerJoin('s.userPermission', 'up'); // Tohle jen kdyby jsi potřeboval ve where podmínku z této tabulky
$qb->where(...);
Editoval Martk (20. 2. 2017 21:10)
- Martk
- Člen | 661
Přidáš jen zpětnou cestu, nemusíš aktualizovat databázi, jen smažeš doctrine cache:
/**
* @ORM\OneToMany(targetEntity="UserPermission")
*/
Pokud nechceš, tak musíš do selectu dát root entitu:
$qb->select('s, up');
// nebo pokud nepotřebuješ celou entitu. Musíš si dávat bacha na co saháš
$qb->select('s, partial up.{id}');
Editoval Martk (20. 2. 2017 22:21)