Я пытаюсь использовать 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
Таким образом, соединения, похоже, полностью исключены.
Для этого можно сначала запросить объекты, которые вы хотите удалить, с помощью соединений:
$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();
Это все.