2015-05-05 126 views
6

我有:兩個實體具有單向M:M關聯。主義加入多對多無關聯

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 
} 

我想要什麼:項目和ShareInfo米之間存在記錄: 從項目表(項目單位),其中至少一個M選擇數據。

我的建議不工作(我有一個語義錯誤)

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

在純SQL我會做這樣的事情:

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

燦」相信這裏沒有DQL類比。我能想象的唯一解決方案是將單向M:M關聯分割爲雙向

P.S.這個問題沒有重複,我檢查得很好。

+0

你已經找到了解決這個問題嗎? – semsem

+1

@semsem我不記得說實話。但是現在我會用一箇中間表來使用MtM關係。請參閱https://stackoverflow.com/questions/15616157/doctrine-2-and-many-to-many-link-table-with-an-extra-field/15630665#15630665 看起來像沒有解決方案,定向關聯。 – Hast

回答

-1

實現這一目標的方式是通過一個子查詢:

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