Вот как я бы это попробовал:
/** @var Doctrine\ORM\EntityManager $em */
$expr = $em->getExpressionBuilder();
$em->createQueryBuilder()
->select(array('DISTINCT i.id', 'i.name', 'o.name'))
->from('Item', 'i')
->join('i.order', 'o')
->where(
$expr->in(
'o.id',
$em->createQueryBuilder()
->select('o2.id')
->from('Order', 'o2')
->join('Item',
'i2',
\Doctrine\ORM\Query\Expr\Join::WITH,
$expr->andX(
$expr->eq('i2.order', 'o2'),
$expr->eq('i2.id', '?1')
)
)
->getDQL()
)
)
->andWhere($expr->neq('i.id', '?2'))
->orderBy('o.orderdate', 'DESC')
->setParameter(1, 5)
->setParameter(2, 5)
;
Я, конечно, не проверял это и сделал некоторые предположения о ваших моделях.Возможные проблемы:
- Ограничение: это было несколько проблем в Doctrine 2, кажется, что построитель запросов не очень хорош в принятии ограничений.Посмотрите здесь , здесь и здесь .
- Предложение IN обычно используется с массивом, но я думаю, что оно будет работатьс подзапросом.
- Возможно, вы можете использовать один и тот же параметр? 1 вместо двух параметров (потому что они имеют одинаковое значение), но я не уверен.
В заключение, это может не сработать в первый раз, но, несомненно, поставит вас на правильный путь.Сообщите нам окончательный 100% правильный ответ.