Doctrine QueryBuilder exclui com junções

Estou tentando usar o Doctrine QueryBuilder para executar a seguinte 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'; 

eu tenho isto

 $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(); 

mas eu recebo:

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

O DQL que vem com a mensagem de erro é:

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

Assim, as uniões parecem ser omitidas completamente.

Uma maneira de conseguir isso pode ser primeiro consultar as entidades que deseja excluir usando as junções:

 $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(); 

E, em seguida, exclua as entidades que encontrou no resultado:

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

Certifique-se de ligar

 $this->entityManager->flush(); 

no local apropriado em sua aplicação (normalmente o controlador).

Parece que o DQL não suporta este tipo de declaração de exclusão. O BNF da documentação Doctrine indica que um delete_statement deve assumir o formato

 delete_clause [where_clause] 

Onde delete_clause é definido como:

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

Então eu posso fornecer um esquema e uma cláusula where, mas não juntas.

Em Symfony2, tente:

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

Isso é tudo.