2016-08-30 17 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 

NATIVE QUERYを使用しますか?私はこれをdqlで行うことはできますか?

+0

二 '$ QB-に直接選択プット>(選択)' – mmmm

+0

@mmmmは – user4785882

+0

クエリビルダは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