Kdyby\Doctrine – join nefunguje jak má

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

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 | 652
+
0
-
$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)

BuGeR
Člen | 45
+
0
-

Ahoj, díky za radu!
Bohužel, já v entitě Site, nemám parametr UserPermission. Tudíž nemohu dát s.userPermission (ani bych ho tam nechtěl přidávat, pokud to není nutné). Jde to udělat nějak bez toho?

Editoval BuGeR (20. 2. 2017 21:43)

Martk
Člen | 652
+
0
-

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)

BuGeR
Člen | 45
+
0
-

super, funguje. Děkuji moc.