Doctrine QueryBuilder>使用ManyToMany关系

时间:2017-03-29 11:08:44

标签: php mysql entity-framework symfony doctrine-orm

我一直在努力解决这个问题,并且所有相关主题都不符合我的具体需求。我正在构建一个"仪表板"这为各种实体提供了系统监督。出于显而易见的原因,我希望尽可能少地提高我的查询效率。因此,我试图将我的查询限制为每个实体1,我检索所有相关信息。

当我需要从ManyToMany(或OneToMany)关系实体中提取特定数据时,我的问题就出现了。

例如,在以下情况中,我试图查找没有任何发票链接到的帐户数量。

    $qb = $this->getDoctrine()->getManager()->createQueryBuilder();
    $qb->select(array(
        'COUNT(account) as totalAccounts', 
        'SUM(account.active) as activeAccounts',
        'SUM(account.approved) as approvedAccounts',
        'SUM(account.reverted) as revertedAccounts',
        'SUM(account.approvalRequested) as pendingApprovalAccounts',
        "SUM(CASE WHEN COUNT(account.invoices) = 0 THEN 1 ELSE 0 END) as testAccounts"
    ))
    ->from('AppBundle:Account', 'account');

我收到以下错误: QueryException:[语义错误]第0行,第252列靠近'发票)= 0':错误:无效的PathExpression。期望StateFieldPathExpression或SingleValuedAssociationField。

在以下示例中,我尝试查找附加了未付款发票的用户数。我加入了user.invoices尝试了一种不同的方法。

    $qb = $this->getDoctrine()->getManager()->createQueryBuilder();
    $qb->select(array(
        'COUNT(user) as totalUsers', 
        'SUM(user.active) as activeUsers',
        "SUM(CASE WHEN user.userType = 'MONTHLY' AND user.active = true THEN 1 ELSE 0 END) as monthlyUsers",
        "SUM(CASE WHEN user.userType = 'PAYG' AND user.active = true THEN 1 ELSE 0 END) as paygUsers",
        "SUM(CASE WHEN user.noticeType = 'SWITCH' AND user.active = true THEN 1 ELSE 0 END) as noticeUsersPayg",
        "SUM(CASE WHEN user.noticeType = 'DISABLE' AND user.active = true THEN 1 ELSE 0 END) as noticeUsersDisable",
        "SUM(CASE WHEN SUM(CASE WHEN invoices.datePaid is null THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END) as suspendedUsers",
    ))
    ->from('AppBundle:User', 'user')
    ->leftJoin('user.invoices', 'invoices');

在这种情况下,我收到错误: SQLSTATE [HY000]:常规错误:1111无效使用群组功能

我可以使用SQL中的所有必要SELECT子查询轻松构建正确的查询,但我尝试使用QueryBuilder以正确的方式执行此操作。 QueryBuilder似乎也不接受或允许SELECT子查询。我知道我可能做了一些(或许多)错误的事情,这就是我发布这个问题的原因。我认为如果正确回答这个问题,其他人可以大大受益,因为关系实体影响返回数据的查询是我们遇到的一个问题,我找不到任何适当的内容来解决这个问题。

1 个答案:

答案 0 :(得分:1)

你现在主要与ORM作战,我认为这是你更善于使用本机查询的情况之一。您基本上只返回标量值以进行报告,使用ORM没有那么多优点。

请参阅http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html