2015-05-05 17 views
6

Ho: due entità con M: M associazione.Doctrine Iscriviti a molti a molti senza associazione

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 
} 

quello che voglio: Selezionare i dati dalla tabella degli elementi (entità articolo), in cui almeno un M: esiste record di m tra elemento e ShareInfo.

Il mio suggerimento che non funziona (ho un errore semantico):

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

In puro SQL farei qualcosa di simile:

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

Can' Credo che non ci sia un analogo DQL per questo. L'unica soluzione che posso immaginare è quella di dividere l'associazione M: M in direzione bidirezionale

P.S. Questa domanda non ha duplicati, ho controllato bene.

+0

Avete trovato una soluzione a questo problema? – semsem

+1

@semsem Non ricordo di essere onesto. Ma ora userei una relazione MtM con un tavolo intermedio. Vedi https://stackoverflow.com/questions/15616157/doctrine-2-and-many-to-many-link-table-with-an-extra-field/15630665#15630665 Sembra che non ci sia una soluzione per uno- associazione direzionale. – Hast

risposta

-1

Il modo per raggiungere questo obiettivo è attraverso una sottoquery:

$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()));