Doctrine QueryBuilder удалить с помощью соединений

Я пытаюсь использовать Doctrine QueryBuilder для выполнения следующего 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'; 

у меня есть это

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

но я получаю:

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

DQL, который поставляется с сообщением об ошибке:

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

Таким образом, соединения, похоже, полностью исключены.

Solutions Collecting From Web of "Doctrine QueryBuilder удалить с помощью соединений"

Для этого можно сначала запросить объекты, которые вы хотите удалить, с помощью соединений:

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

Затем удалите объекты, найденные в результате:

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

Обязательно позвоните

 $this->entityManager->flush(); 

в соответствующем месте вашего приложения (обычно это контроллер).

Похоже, DQL не поддерживает этот вид инструкции delete. BNF из документации Doctrine указывает, что элемент delete_statement должен принимать форму

 delete_clause [where_clause] 

Где delete_clause определяется как:

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

Поэтому я могу предоставить схему и предложение where, но не присоединяется.

На Symfony2 попробуйте:

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

Это все.