Конструктор запросов Doctrine — вложенные запросы

Как я могу преобразовать этот запрос в построитель запросов доктрины symfony 2?

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 (дата). Любая помощь в этом очень ценится.


person Programmer    schedule 01.08.2017    source источник
comment
Я думаю, вам нужно что-то похожее на этот вопрос   -  person squareCircle    schedule 03.08.2017


Ответы (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();

Ваше здоровье!!!

person Anjana Silva    schedule 04.08.2017