2015-05-05 5 views
6

Ich habe: zwei Einheiten mit unidirektionaler M: M-Zuordnung.Doktrin Join Viele zu viele ohne Assoziation

class ShareInfo 
{ 
    // ... 

    /** 
    * @ORM\ManyToMany(targetEntity="Item") 
    * @ORM\JoinTable(name="share_info_items", 
    *  joinColumns={@ORM\JoinColumn(name="share_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}) 
    * 
    * @var Item[] 
    */ 
    private $items; 
} 

class Item 
{ 
    // ... 

    // This entity has no association with ShareInfo, 
    // because M:M is undirectional and defined in ShareInfo entity 
} 

Was ich will: Wählen Sie Daten aus den Gegenständen Tabelle (Punkt Einheit), wobei mindestens ein M: M Bilanz zwischen Artikel und ShareInfo existiert.

Mein Vorschlag, die nicht funktioniert (ich habe einen semantischen Fehler bekam):

$queryBuilder 
    ->select('i') 
    ->from(Item::class, 'i') 
    ->innerJoin(ShareInfo::class, 'shareInfo', 'WITH', 'shareInfo.items = i'); 

In reinen SQL ich so etwas tun würde:

SELECT i.* 
FROM items i 
INNER JOIN share_info_items shareInfo 
    ON shareInfo.item_id = i.id 

Can‘ Ich glaube, dafür gibt es kein DQL-Analog. Die einzige Lösung, die ich mir vorstellen kann, ist das Aufteilen der unidirektionalen M: M-Assoziation in bidirektionale

P.S. Diese Frage hat keine Duplikate, habe ich gut überprüft.

+0

Haben Sie eine Lösung für dieses Problem gefunden? – semsem

+1

@semsem Ich erinnere mich nicht, um ehrlich zu sein. Aber jetzt würde ich eine MtM-Beziehung mit einer Zwischentabelle verwenden. Siehe https://StackOverflow.com/questions/15616157/doctrine-2-and-many-to-many-link-table-with-an-extra-field/15630665#15630665 Sieht aus wie es keine Lösung für one- gibt gerichtete Assoziation. – Hast

Antwort

-1

Der Weg, dies zu erreichen, ist durch eine Unterabfrage:

$em=$this->getDoctrine()->getManager(); 
$queryBuilder1=$em->createQueryBuilder(); 
$queryBuilder1->select(array('DISTINCT i.id')) 
      ->from('AppBundle:ShareInfo', 'share_info') 
      ->innerJoin('share_info.items', 'i'); 
$queryBuilder=$em->createQueryBuilder(); 
$queryBuilder->select('i') 
     ->from('AppBundle:items', 'i') 
     ->where($queryBuilder->expr() 
     ->in('i.id',$queryBuilder1->getDql()));