Query Builder Ошибка в доктрине Symfony с использованием где в - PullRequest
0 голосов
/ 14 марта 2019

У меня есть необработанный запрос, который я хотел бы преобразовать в доктрину ORM. Это в основном запрос, который содержит подзапрос для подсчета общего количества.

SELECT Count(*) AS total_count 
FROM   (SELECT * 
        FROM   content_item_languages 
        WHERE  default_content_item_id IN (SELECT id AS default_content_item_id 
               FROM   content_item 
               WHERE  content_type = 1 
                      AND is_translated = 0 
                      AND modified_on >= 
                          '$timePeriodStart' 
                      AND is_active = 1) 
           AND language_id = '$language') AS t 

Я написал ниже доктрину ORM, но все равно получаю ошибку

$em = $this->getEntityManager()->createQueryBuilder();

$totalPostSubselect = $em->addSelect('c.id AS defaultContentItemId')
                    ->from('AppBundle\Entity\ContentItem\ContentItem', 'c')
                    ->andWhere('c.contentType = 1')
                    ->andWhere('c.isTranslated = 0')
                    ->andWhere('c.modifiedOn >= :timeperiod')
                    ->andWhere('c.isActive = :status') 
                    ->setParameter('status', 1)
                    ->setParameter('timeperiod', $timePeriodStart)->getDQL();

 $em = $this->getEntityManager()->createQueryBuilder(); 

 $defaultSubSelect = $em->addSelect(['*'])
                    ->from('AppBundle\Entity\ContentItem\ContentItemLanguages', 'cl')
                    ->andWhere("cl.defaultContentItemId IN ($totalPostSubselect)")
                    ->andWhere('cl.languageId = :language')
                    ->setParameter('subSelect', $totalPostSubselect)
                    ->setParameter('language', $language)->getDQL();



 $em = $this->getEntityManager()->createQueryBuilder();


 $mainQuerySelect = $em->addSelect(["count(*) as total_count"])
                       ->from("(".$defaultSubSelect.")", 'AS t')->getQuery();

 return $mainQuerySelect->getResult();

Вот ошибка, которую я получил

[Doctrine\ORM\Query\QueryException] [Syntax Error] line 0, col 13: Error: Expected Literal, got '*'


[Doctrine\ORM\Query\QueryException]
    SELECT count(*) as total_count FROM (SELECT * FROM 
    AppBundle\Entity\ContentItem\ContentItemLanguages cl
       WHERE (
          cl.defaultContentItemId IN (SELECT c.id AS defaultContentItemId 
           FROM AppBundle\Entity\ContentItem\ContentItem c WHERE 
                c.contentType = 1 AND 
                c.isTranslated = 0 AND
                c.modifiedOn >= :timeperiod AND c.isActive = :status)) 
       AND cl.languageId = :language) AS t

Может кто-нибудь подсказать, где именно я не так делаю?

1 Ответ

0 голосов
/ 14 марта 2019

На языке запросов доктрины вы не можете SELECT *, вместо этого вам приходится иметь дело с объектами.Для вашего примера что-то вроде:

$mainQuerySelect = $em->addSelect("count(t.id) as total_count")
                       ->from("(".$defaultSubSelect.")", 'AS t')->getQuery();
...