我一直在努力解决这个问题,并且所有相关主题都不符合我的具体需求。我正在构建一个"仪表板"这为各种实体提供了系统监督。出于显而易见的原因,我希望尽可能少地提高我的查询效率。因此,我试图将我的查询限制为每个实体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子查询。我知道我可能做了一些(或许多)错误的事情,这就是我发布这个问题的原因。我认为如果正确回答这个问题,其他人可以大大受益,因为关系实体影响返回数据的查询是我们遇到的一个问题,我找不到任何适当的内容来解决这个问题。
答案 0 :(得分:1)
你现在主要与ORM作战,我认为这是你更善于使用本机查询的情况之一。您基本上只返回标量值以进行报告,使用ORM没有那么多优点。
请参阅http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html