Использовать подзапрос для Where IN с множественным addSelect - PullRequest
0 голосов
/ 03 апреля 2019

Я создал подзапрос и запрос с помощью querybuilder, и мне нужно использовать подзапрос с помощью where in, но мой подзапрос использует множественный выбор, и я не знаю, как с этим справиться.

Мой подзапрос смножественный выбор:

        $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');

У меня ошибка:

Ошибка: ожидаемая доктрина \ ORM \ Query \ Lexer :: T_FROM, получена',' ",

У меня есть ошибка, потому что я использую множественный выбор в моем подзапросе. Если кто-то может мне помочь. Спасибо

1 Ответ

0 голосов
/ 03 апреля 2019

откровенно просто, вы могли бы также просто повторить запрос, хотя ... но это также должно работать ... просто захватить то, что вы получили до сих пор, и продолжать расширяться после этого (возможно, вам придется исправить то, что происходит до и после 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).

...