在带有多个addSelect的Where IN上使用子查询

时间:2019-04-03 17:09:37

标签: symfony query-builder

我已经创建了一个子查询和一个带有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,我在子查询上使用了多次选择。 如果有人可以帮助我。谢谢

2 个答案:

答案 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 )。