Doctrine查询构建器 - 嵌套查询

时间:2017-08-01 09:09:57

标签: doctrine-orm doctrine symfony-2.7

如何将此查询转换为symfony 2 doctrine查询构建器?

SELECT
    artist_id,
    DATE,
    balance,
    TYPE
FROM TRANSACTION AS
    t1
WHERE
    DATE =(
    SELECT
        MAX(DATE)
    FROM TRANSACTION
WHERE
    artist_id = t1.artist_id AND
STATUS
    IN(
        'partial',
        'pending',
        'deducted',
        'accepted'
    ) AND TYPE NOT LIKE 'payment'
)
GROUP BY
    artist_id
ORDER BY
    artist_id

我尝试了以下内容:

$qb = $this->getEntityManager()->createQueryBuilder()
->select('t.balance','a.id','t.date')
           ->from('TestMainBundle:Transaction','t')
           ->Join('t.artist','a')
           ->where("t.status in ('partial','pending','deducted','accepted')")
           ->andWhere("t.type NOT LIKE 'payment'")
           ->groupBy('a.id')
           ->orderBy('a.id');
        return $qb->getQuery()->getResult();

但我仍然坚持包括max(日期)的条件。对此非常感谢。

1 个答案:

答案 0 :(得分:1)

你的Doctrine查询看起来像这样,

$qb1 = $this->getDoctrine()->getManager()->createQueryBuilder();        
$select = $qb1->select('MAX(date) AS max_data')
        ->from('YourBundle:Transaction', 's')
        ->where('s.artist_id = :ti_artist_id')
        ->andWhere('s.status IN (:statuses)')
        ->andWhere('s.type NOT LIKE :type')
        ->getQuery();

$qb2 = $this->getDoctrine()->getManager()->createQueryBuilder();
$result = $qb2->select('t.artist_id', 't.date', 't.balance', 't.type')
        ->from('YourBundle:Transaction', 't');

$result->where($qb2->expr()->eq('t.date', $select->getDQL()))
        ->setParameter('ti_artist_id', 't.id')
        ->setParameter('statuses', array('partial','pending','deducted','accepted'))
        ->setParameter('type', 'payment') //possibly '%payment%'
        ->orderBy('t.artist_id')
        ->getQuery()
        ->getResult();

干杯!!!