因此,我在使用查询构建器思考如何解决此问题时遇到了一些麻烦。目前,我有三个对象如下:
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
)
谢谢大家的帮助。
答案 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)
希望这个帮助