簡體   English   中英

Doctrine2在表上多對多聯接

[英]Doctrine2 Many to Many Multiple Join on Table

我的架構如下所示:

items - item_id, ...
items_item_types - item_id, item_type_id
item_types - item_type_id, ...

我需要一個查詢,該查詢將獲取具有給定所有項目類型的項目。 例如,假設第1項是類型10,第2項是類型10、11和12。給定10和11,則不會返回第1項,但會返回第2項。

為了進一步說明:

--------------------------
| item_id | item_type_id |
| 1       | 10           |
| 2       | 10           |
| 2       | 11           |
| 2       | 12           |
--------------------------

例如,我可以在SQL中輕松完成此操作

select * from items 
    join item_item_types join_table1 on items.item_id = join_table1.item_id and join_table1.item_type_id = 10
    join item_item_types join_table2 on items.item_id = join_table1.item_id and join_table2.item_type_id = 11

在這種情況下將返回項目2

該查詢已經非常復雜,並且正在向我傳遞對QueryBuilder對象的引用,因此,就我所知,我無法使用本機SQL。 我的代碼如下所示:

function addItemTypesToQuery(&$qb, $itemTypes) {
    foreach($itemTypes as $key => $value) {
        $qb->join('item.itemTypes', 'item_type' . $key, 'WITH', ???)
    }
}

我不確定鏡像SQL的聯接條件是什么。 Doctrine跳過了加入item_item_types表的中間步驟,但是我需要在THAT而不是item_types表上設置連接條件。

Doctrine將自動處理聯接,並使用ItemType實體ID或實體引用在“多對多”表中搜索一組值。 這是通過DQL MEMBER OF完成的:

function addItemTypesToQuery(&$qb, $itemTypes) {
    $i = 0;
    foreach($itemTypes as $key => $value) {
        $qb->addWhere('?'.$i.' MEMBER OF item.itemTypes')
            ->setParameter($i++, $key)
        ;
    }
}

注意:我不知道QueryBuilder的父結構,但是如果您已經用數字標識符設置了參數,則可能會遇到問題。 一種選擇是:

function addItemTypesToQuery(&$qb, $itemTypes) {
    $i = 0;
    foreach($itemTypes as $key => $value) {
        $qb->addWhere(':itemWhere'.$i.' MEMBER OF item.itemTypes')
            ->setParameter('itemWhere'.$i++, $key)
        ;
    }
}

請注意, $key 必須ItemType實體的主要標識符。 如果它是實際的ItemType實體引用,則也可以使用$value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM