2016-06-30 14 views
0

Ich bin ziemlich neu in Doctrine2 und ich versuche es einfach zu lernen, indem ich es benutze.Unerwünschte Join-Bedingung mit Doctrine2

Ich habe zwei Tabellen, Gruppe und Benutzer. Die Gruppe kann einen Vorsitzenden, stellvertretende Vorsitzende und Mitglieder haben. Mein Problem tritt auf, wenn ich versuche, eine Liste von Gruppen mit Benutzer als Vorsitzender oder stellvertretender Vorsitzender zu erhalten. Dies ist meine Anmerkung zum Vice-Chairman in der Konzerneinheit.

/** 
* @var string 
* 
* @ORM\ManyToMany(targetEntity="User") 
* @ORM\JoinTable(name="vicechairmen", 
*  joinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
*) 
*/ 
private $vicechairmen; 

Abfrage-Generator

$qry = $this->entManager->getRepository("Entities\Local\Group")->createQueryBuilder("g"); 
$qry->leftJoin("g.vicechairmen", "gv", "WITH", "gv.id = g.id"); 
$qry->where($qry->expr()->eq('g.chairman', $id))->orWhere($qry->expr()->eq('gv.id', $id)); 

(irgendwie) Erwartete SQL-Abfrage

SELECT g.id FROM `group` g 
LEFT JOIN vicechairmen vg ON g.id = vg.group_id 
LEFT JOIN user u ON u.id = vg.user_id 
WHERE g.chairman_id = 4 OR u.id = 4 

aber ich bekomme (select verkürzt und umbenannt Aliase) würde

SELECT g.id FROM `group` g 
LEFT JOIN vicechairmen vg ON g.id = vg.group_id 
LEFT JOIN user u ON u.id = vg.user_id AND u.id = g.id 
WHERE g.chairman_id = 4 OR u.id = 4 

die Frage Deshalb ist die Lehre tr Ying, um Benutzer und Gruppe mit ihren IDs zu verbinden? Und wie man es verbietet?

Antwort

0

Es ist, weil Ihre Anmerkung es erzwingen, in besserem Wort sollte ich sagen, dass Sie Gruppentabelle durch Benutzer aggregieren. Sie sollten viele entfernen, um Ihrer Anmerkung beizutreten, um dies zu überspringen. Doctrine erstellt viele bis viele Joins, wenn Sie eine Beziehung in Ihren Datenbankfeldern haben.