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)