В документации Доктрины я нашел это:
// Example - $qb->expr()->in('u.id', array(1, 2, 3))
// Make sure that you do NOT use something similar to $qb->expr()->in('value', array('stringvalue')) as this will cause Doctrine to throw an Exception.
// Instead, use $qb->expr()->in('value', array('?1')) and bind your parameter to ?1 (see section above)
public function in($x, $y); // Returns Expr\Func instance
// Example - $qb->expr()->notIn('u.id', '2')
public function notIn($x, $y); // Returns Expr\Func instance
Должна быть возможность поместить подзапрос в эту функцию. Я никогда не использовал его сам, но попробуй.
EDIT
Я понимаю, что это отношение многих ко многим. В этом случае вы должны использовать опцию MEMBER OF
.
Так как:
$qb->...
->andWhere("p.category MEMBER OF ?1")
->andWhere("p.category MEMBER OF ?2")
->...