Me gustaría seleccionar miembros que no estén en un servicio específico. Tengo 3 tablas:Subconsultar en doctrine2 notIN Función
membre
service
membre_service
(relación entremembre
yservice
)
estoy usando la doctrina 2 y en SQL mi consulta es:
SELECT m.* FROM membre m WHERE m.`id` NOT IN (
SELECT ms.membre_id FROM membre_service ms WHERE ms.service_id != 29
)
En Doctrine, I d o:
$qb = $this->_em->createQueryBuilder();
$qb2 = $qb;
$qb2->select('m.id')
->from('Custom\Entity\MembreService', 'ms')
->leftJoin('ms.membre', 'm')
->where('ms.id != ?1')
->setParameter(1, $service);
$qb = $this->_em->createQueryBuilder();
$qb->select('m')
->from('Custom\Entity\Membre', 'm')
->where($qb->expr()->notIn('m.id', $qb2->getDQL())
);
$query = $qb->getQuery();
//$query->useResultCache(true, 1200, __FUNCTION__);
return $query->getResult();
me dieron el siguiente error:
Semantical Error] line 0, col 123 near 'm WHERE ms.id': Error: 'm' is already defined.
¡Gracias por tu respuesta! MembreService ya está en many-to-many ... ¡Realmente me ayudaste! Y vea mi edición para la respuesta final. Que Dios los bendiga ... –
Si está usando parámetros en la subconsulta: $ qb-> setParameters ($ qb2-> getParameters()); es necesario, aunque es posible que desee $ qb-> setParameters (array_merge ($ qb2-> getParameters(), $ qb-> getParameters())) para evitar la anulación de los parámetros de la consulta exterior. – Omn
Hmmm ... tome mi último comentario con un grano de sal, que solo parece funcionar en algunas versiones de la doctrina ... en otras versiones setParameters reemplaza en lugar de agrega a los parámetros ... – Omn