2013-06-25 7 views
8

は、私は次のSQLクエリを実行するために教義QueryBuilderを使用しようとしている加入:教義QueryBuilderはして削除

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 

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

答えて

8

の方法は、最初のクエリにご加入を使用して削除するエンティティであるかもしれない

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

をして

$this->entityManager->flush(); 

あなたのアプリケーションの適切な場所(通常はコントローラ)。 Symfony2のオン

+1

言及しておきたいことは2つだけです。これは非常に高価なことがあります。 2.コントローラにそのようなロジックを入れることを敢えてしないでください! – EnchanterIO

+2

第3のもの - これは競争条件になりがちです。 – Kaspars

7

DQLはこの種のdelete文をサポートしていないようです。だから私は、スキーマや句を提供することができます

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

が、ない加入:BNF from the Doctrine documentationdelete_clauseは次のように定義されていない場合はdelete_statementフォーム

delete_clause [where_clause] 

を取る必要があることを示します。その後、

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

そして、あなたはその結果で見つかったエンティティを削除します:これを達成する

-2

てみてください。すべてのザッツ

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

$em->flush(); 

を。

+0

より微妙な削除(例えば元の質問)が必要な場合、このデフォルトの '$ em-> remove($ entity)'メソッドは機能しません。 –