2016-08-30 3 views
1

У меня есть следующая таблицаDoctrine2 как создать совокупный подзапрос

id int not null auto icrement 
email_name varchar 
event_type varchar 

тип электронной почты - возможные значения (отправлено, открыто, нажмите, отписался) мне нужно создать запрос, как это в doctrine2

SELECT COUNT(ee.id) as total, (SELECT COUNT(e.id) from email_statistic as e where e.event_type = 'open') as opened FROM email_statistic as ee 

Я хочу выбрать общую сумму и количество открытых электронных писем для статистики Как я могу сделать это доктрину wia?

$qb = $this->createQueryBuilder('ee') 
      ->select('count(ee) As total'); 

$qb2 = $this->createQueryBuilder('e') 
      ->select('count(e) As opened'); 

     $qb2 
      ->andWhere('es.eventType = :eventType') 
      ->setParameter('eventType', 'open'); 

$qb->addSelect($qb2) --- this does not allowed by doctrine 

Должен ли я использовать НАРОДНЫЙ ЗАПРОС? Могу ли я сделать это с помощью dql?

+0

положить, что второй выбор непосредственно в '$ qb-> выберите()' – mmmm

+0

@mmmm не работает – user4785882

+0

Query Builder работает с сущностями через DQL. Я не вижу здесь ничего сущности. И ваше предположение правильно, вы, вероятно, захотите использовать собственный запрос здесь. –

ответ

1

Во-первых, вы должны создать объект, например EmailStatistic:

/** 
* @ORM\Entity() 
* @ORM\Table() 
*/ 
class EmailStatistic 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id() 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email_type", type="string", length=255) 
    */ 
    protected $emailType; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email_name", type="string", length=255) 
    */ 
    protected $emailName; 
} 

Затем вы можете использовать GeneralCaseExpression (http://www.doctrine-project.org/api/orm/2.4/class-Doctrine.ORM.Query.AST.GeneralCaseExpression.html).

$em = $this->get('doctrine')->getEntityManager(); 
$qb = $em->createQueryBuilder(); 
$result = $qb 
    ->select('SUM(CASE WHEN (e.emailType = \'open\') THEN 1 ELSE 0 END) as opened') 
    ->addSelect('SUM(e.id) as total') 
    ->from('AppBundle:EmailStatistic', 'e') 
    ->getQuery() 
    ->getArrayResult(); 
// $result[0]['opened'] contains number of opened emails 
// $result[0]['total'] contains total number of emails 

 Смежные вопросы

  • Нет связанных вопросов^_^