我已经创建了一个子查询和一个带有querybuilder的查询,我需要在子位置使用子查询,但是我的子查询使用了多个选择,而且我不知道该如何处理。
我的带有多个选择的子查询:
$qbLastHour = $this->createQueryBuilder('cc');
$qbLastHour
->select('aa.id')
->addSelect('MAX(aa.createdAt) as mdate')
->addSelect('DATE_FORMAT(aa.createdAt, \'%d-%m-%Y\') as ddate')
->innerJoin('cc.analytics', 'aa')
->groupBy('cc.id')
->addGroupBy('ddate')
->orderBy('aa.createdAt', 'DESC');
我的查询:
$expr = $qb->expr();
$qb->select('a.id')
->addSelect('COALESCE(SUM(a.viewCount),0) as viewCount')
->addSelect('DATE_FORMAT(a.createdAt, \'%d-%m-%Y\') as date');
$qb->innerJoin('c.analytics', 'a')
->andWhere($expr->in('a.id', $qbLastHour->getDQL()))
->addGroupBy('date')
->orderBy('a.createdAt', 'DESC');
我有错误:
错误:预期的Doctrine \ ORM \ Query \ Lexer :: T_FROM,得到了','“,
我有该错误beaucoup,我在子查询上使用了多次选择。 如果有人可以帮助我。谢谢
答案 0 :(得分:0)
如果有人有更好的解决方案: 我需要getResult才能工作。 我尝试将隐藏用于其他addselect,但不起作用
$qbLastRecord-> = $this->createQueryBuilder('cc');
$qbLastRecord->
->select('aa.id')
->addSelect('MAX(aa.createdAt) as mdate')
->addSelect('DATE_FORMAT(aa.createdAt, \'%d-%m-%Y\') as ddate')
->innerJoin('cc.analytics', 'aa')
->groupBy('cc.id')
->addGroupBy('ddate')
->orderBy('aa.createdAt', 'DESC');
$expr = $qb->expr();
$qb->select('a.id')
->addSelect('COALESCE(SUM(a.viewCount),0) as viewCount')
->addSelect('DATE_FORMAT(a.createdAt, \'%d-%m-%Y\') as date');
$qb->innerJoin('c.analytics', 'a')
->andWhere('a.id IN (:query)')
->setParameter('query', $qbLastRecord->getQuery()->getResult())
->addGroupBy('date')
->orderBy('a.createdAt', 'DESC');
答案 1 :(得分:0)
很简单,虽然您也可以重复查询……但是,它也应该工作……只是捕获您到目前为止所获得的内容,然后继续进行扩展(您可能必须修复之前和之后的内容) getDQL; o)
$qbLastHour = $this->createQueryBuilder('cc');
$qbLastHour
->select('aa.id')
->innerJoin('cc.analytics', 'aa')
->groupBy('cc.id')
->orderBy('aa.createdAt', 'DESC');
$dqlForLater = $qbLastHour->getDQL();
$qbLastHour->addSelect('MAX(aa.createdAt) as mdate')
->addSelect('DATE_FORMAT(aa.createdAt, \'%d-%m-%Y\') as ddate')
->addGroupBy('ddate');
$expr = $qb->expr();
$qb->select('a.id')
->addSelect('COALESCE(SUM(a.viewCount),0) as viewCount')
->addSelect('DATE_FORMAT(a.createdAt, \'%d-%m-%Y\') as date');
$qb->innerJoin('c.analytics', 'a')
->andWhere('a.id IN (:query)')
->setParameter('query', $dqlForLater)
->addGroupBy('date')
->orderBy('a.createdAt', 'DESC');
或者,只要将第一部分放入一个函数中,然后将扩展部分放入另一个函数中,则在需要添加附加分组的情况下,将它们都调用,然后在主体查询中使用第一部分即可(而不是$dqlForLater
)。