Filtrer le résultat d'une relation avec Doctrine 2

Il s'agit d'un problème que j'ai rencontré récemment, comment filtrer les résultats d'une relation entre deux entité. Doctrine permet de faire ça très simplement en ajoutant une condition sur une jointure.

Contexte

J'ai une entité Article et une entité Comment avec une relation OneToMany (Comments) entre les deux. Je souhaite récupérer des articles avec leur commentaires afin d'exploiter directement la relation.

Relation entre les articles et les commentaires

Le code

Habituellement j'utiliserai une jointure sur ma relation.

$db = $this->getDoctrine()->getRepository('ColinBlogBundle:Article')
    ->createQueryBuilder('a')
    ->leftJoin('a.Comments','c');
$articles = $qb->getQuery()->execute();

En bouclant sur mes articles, $article->getComments() me donne tous les commentaires de l'article.

Néanmoins je ne veux pas tout les commentaires de chaque article mais seulement ceux dont le status est 'approved'. Il faut alors ajouter cette condition dans la jointure.

use Doctrine\ORM\Query\Expr;

$db = $this->getDoctrine()->getRepository('ColinBlogBundle:Article')
    ->createQueryBuilder('a')
    ->leftJoin('a.Comments', 'c', Expr\Join::WITH, 'c.status = :status')
    ->setParameter('status', 'approved');
$articles = $qb->getQuery()->execute();

Cette fois ci, $article->getComments() ne me donne que les commentaires désirés.

Les commentaires