19

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

したがって、結合は完全に省略されているようです。

4

4 に答える 4

13

DQL はこの種の削除ステートメントをサポートしていないようです。Doctrine ドキュメントのBNFdelete_statementは、 aが次の形式を取る必要があることを示しています

delete_clause [where_clause]

は次delete_clauseのように定義されます。

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

したがって、スキーマと where 句を提供できますが、結合は提供できません。

于 2013-06-25T15:57:14.653 に答える
4

これを達成する方法は、結合を使用して削除するエンティティを最初にクエリすることです。

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

アプリケーションの適切な場所 (通常はコントローラー) に配置します。

于 2013-07-25T15:41:20.680 に答える
-6

Symfony2 で試してください:

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

$em->flush();

それで全部です。

于 2014-11-10T21:55:15.290 に答える