C'est comme ça que j'essaierais :
/** @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)
;
Je n'ai pas testé cela bien sûr, et j'ai fait quelques hypothèses sur vos modèles. Problèmes possibles :
- Limite : cela a été un peu un problème dans Doctrine 2, il semble que le constructeur de requêtes n'est pas très bon pour accepter les limites. Jetez-y un coup d'oeil aquí , aquí y aquí .
- La clause IN est généralement utilisée avec un tableau, mais je pense qu'elle fonctionnera avec une sous-requête.
- Vous pouvez probablement utiliser le même paramètre ?1, au lieu de deux paramètres (car ils ont la même valeur), mais je n'en suis pas sûr.
En conclusion, cela ne fonctionnera peut-être pas du premier coup, mais vous mettra sûrement sur la bonne voie. Dites-nous ensuite la réponse finale 100% correcte.