繁体   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