在Doctrine的QueryBuilder中使用嵌套查询和多对多关系

时间:2015-01-12 08:57:51

标签: php mysql symfony doctrine-orm

因此,我在使用查询构建器思考如何解决此问题时遇到了一些麻烦。目前,我有三个对象如下:

HelpRequest
    id
    ...
    status

Filter
    id
    name
    statuses ->  ManyToMany(targetEntity="Status")

Status
    id
    name

过滤器可以有多种状态,因此有一个表可以跟踪哪些状态是特定过滤器的一部分。

样本数据

help_requests
---
| id | content | status |
| 1  | hello   | 3      |

filters
---
| id | name     |
| 1  | Active   |
| 1  | Inactive |

statuses
---
| id | name                  |
| 1  | Open                  |
| 2  | Closed                |
| 3  | Waiting User Response |

status_filter
---
| status_id | filter_id |
| 1         | 1         |
| 3         | 1         |
| 2         | 2         |

status_filter表是从Status对象和Filter对象之间的Doctrine中的ManyToMany关系自动生成的。

根据给定的信息,我已经编写了这个SQL查询,但现在我遇到了使用QueryBuilder编写这个问题的麻烦。

SELECT * FROM help_requests WHERE status IN (SELECT status_id FROM status_filter WHERE filter_id = 1)

如果我能提供更多信息,请告诉我。我已经阅读了关于SO的多个问题,并尝试了很多方面,但我似乎无法做到这一点。我知道我可以对该查询进行硬编码,但我喜欢使用QueryBuilder的经验

感谢您的帮助!

更新

最后,由于我无法使用QueryBuilder并且我不想创建一个新实体,只是为了将其他两个实体映射到一起,我决定使用createQuery()代替这就是我提出的:

SELECT
    hr
FROM
    HelpRequest hr
WHERE
    hr.status
IN (
    SELECT
        s.id
    FROM
        Filter f
    JOIN
        f.statuses s
    WHERE
        f.name = :name
    )

谢谢大家的帮助。

2 个答案:

答案 0 :(得分:2)

尝试此查询,并将其放在HelpRequestsRepository类中:

$subquery = $this->->select('st.status_id')
    ->from('/path/to/StatusFilter', 'st')
    ->where('st.filter_id = 1');

$query = $this->createQueryBuilder('hr')
    ->select('*')
    ->where('hr.status IN (' . $subquery->getDQL() . ')')
    ->getQuery();

答案 1 :(得分:1)

HelpRequestsRepository类中尝试此方法:

    $qb = $this->createQueryBuilder('hr');
    $qb->select("hr");
    $qb->join("::Status","s",Expr\Join::INNER_JOIN, "hr.status=s" );
    $qb->join("::Filter","f",Expr\Join::INNER_JOIN, "s.filters=f" );
    $qb->where("f.name = :name");
    $qb->setParameter('name', $nameOfTheFilterToBeFound)

希望这个帮助