2013-06-25 43 views
8

我試圖用主義QueryBuilder的執行下面的SQL查詢:主義的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

來完成,這可能是第一次查詢實體要使用要刪除的方式加入:

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

在您的應用程序的適當位置(通常是控制器)。

+1

只需提兩件事。 1.這可能非常昂貴。 2.不敢將這樣的邏輯放入控制器! – EnchanterIO

+2

第三件事 - 這很容易出現競爭狀況。 – Kaspars

7

它看起來像DQL不支持這種刪除語句。該BNF from the Doctrine documentation表明delete_statement必須採取的形式

delete_clause [where_clause] 

delete_clause被定義爲:

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

所以我可以提供一個架構和一個where子句,但沒有連接。

-2

在Symfony2的請嘗試:

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

$em->flush(); 

這就是所有。

+0

如果你需要更細微的刪除(例如原始問題),這個默認的'$ em-> remove($ entity)'方法將不起作用。 –