Php 在条令';s查询生成器

Php 在条令';s查询生成器,php,mysql,symfony,doctrine-orm,Php,Mysql,Symfony,Doctrine Orm,因此,我在思考如何使用查询生成器实现这一点时遇到了一些困难。目前,我有以下三个对象: HelpRequest id ... status Filter id name statuses -> ManyToMany(targetEntity="Status") Status id name 一个过滤器可以有多个状态,因此有一个表跟踪哪些状态是特定过滤器的一部分 样本数据 help_requests --- | id |

因此,我在思考如何使用查询生成器实现这一点时遇到了一些困难。目前,我有以下三个对象:

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\u filter
表是根据条令中status对象和filter对象之间的多个关系自动生成的

基于给定的信息,我已经编写了这个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
    )

谢谢大家的帮助。

尝试此查询,并将其放入您的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();

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)

希望这有帮助

很抱歉,我已经编辑了我的问题。我没有StatusFilter对象,它只是两个对象(Status和Filter)之间的多个关系。如果有一种方法可以避免仅仅为了保持两个表的相关性而创建一个对象,那就太好了。不管status\u filter table是否是从manytomy关系自动生成的。您可以为它创建一个存储库类并查询它。为它生成一个存储库类需要有一个实体吗?很抱歉响应太慢,我不得不避开这个问题。通过您的解决方案,我不断得到以下信息:“错误:无效的PathExpression.StateFieldPathExpression或SingleValuedAssociationField应为。”对于我缺少的内容,有什么想法吗?