Doctrine QueryBuilder eliminar con combinaciones

Intento utilizar Doctrine QueryBuilder para realizar la siguiente consulta SQL:

DELETE php FROM product_hole_pattern php INNER JOIN hole_pattern hp ON php.hole_pattern_id = hp.id INNER JOIN hole_pattern_type hpt ON hp.hole_pattern_type_id = hpt.id WHERE php.product_id = 4 AND hpt.slug='universal'; 

tengo esto

 $qb = $this->entityManager->createQueryBuilder(); $query = $qb->delete('\SANUS\Entity\ProductHolePattern', 'php') ->innerJoin('php.holePattern', 'hp') ->innerJoin('hp.holePatternType', 'hpt') ->where('hpt.slug = :slug AND php.product=:product') ->setParameter('slug','universal') ->setParameter('product',$this->id) ->getQuery(); 

pero entiendo:

 [Semantical Error] line 0, col 50 near 'hpt.slug = :slug': Error: 'hpt' is not defined. 

El DQL que viene con el mensaje de error es:

 DELETE \SANUS\Entity\ProductHolePattern php WHERE hpt.slug = :slug AND php.product=:product 

Entonces las uniones parecen ser omitidas por completo.

Una forma de lograr esto podría ser primero consultar las entidades que desea eliminar utilizando las uniones:

 $qb = $this->entityManager->createQueryBuilder(); $query = $qb->select('\SANUS\Entity\ProductHolePattern', 'php') ->innerJoin('php.holePattern', 'hp') ->innerJoin('hp.holePatternType', 'hpt') ->where('hpt.slug = :slug AND php.product=:product') ->setParameter('slug','universal') ->setParameter('product',$this->id) ->getQuery(); $results = $query->execute(); 

Y luego borre las entidades que encontró en el resultado:

 foreach ($results as $result) { $this->entityManager->remove($result); } 

Asegúrate de llamar

 $this->entityManager->flush(); 

en el lugar apropiado en su aplicación (generalmente el controlador).

Parece que DQL no es compatible con este tipo de instrucción de eliminación. El BNF de la documentación de Doctrine indica que una delete_statement debe tomar la forma

 delete_clause [where_clause] 

Donde delete_clause se define como:

 "DELETE" "FROM" abstract_schema_name [["AS"] identification_variable] 

Entonces puedo proporcionar un esquema y una cláusula where, pero no join.

En Symfony2, intente:

 foreach ($results as $result) { $em->remove($result); } $em->flush(); 

Eso es todo.