2013-07-15 48 views
4

Softdelete行爲工作正常通過實體管理器上執行delete語句如下面的代碼:Symfony2的SoftDeleteable不工作的QueryBuilder刪除

$entity = $this->em->getRepository('Users')->find(7); 
$this->em->remove($entity); 
$this->em->flush(); 

但是當通過QueryBuilder的執行相同的功能硬刪除將執行數據庫

$qb = $this->em->createQueryBuilder(); 
$qb->delete('Users', 'p'); 
$qb->where($qb->expr()->eq('p.id', ':id')); 
$qb->setParameters(array("id" => 7)); 
$result = $qb->getQuery()->getResult(); 

我怎麼能允許或者通過實體管理器或查詢生成器

回答

10

所有情況下softdelete如果使用DQL日你必須使用查詢提示。這應該做的伎倆:

$query = $qb->getQuery() 

$query->setHint(
    \Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER, 
    'Gedmo\SoftDeleteable\Query\TreeWalker\SoftDeleteableWalker' 
); 

$result = $query->getResult(); 

更新:

該文檔提到,你必須使用一個查詢提示,但所以我把他們的測試,使用不提供一個例子。

文檔:https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/softdeleteable.md

測試使用方法:https://github.com/l3pp4rd/DoctrineExtensions/blob/master/tests/Gedmo/SoftDeleteable/SoftDeleteableEntityTest.php

+0

非常感謝你親愛的,我已經通過庫內的編輯代碼解決了它們......但這種方式更專業,達到標準 – HMagdy

0

我以前的答覆後,老辦法由@Ken Hannel是:

編輯: /供應商/教義/ ORM/lib中/教義/ ORM /Query/SqlWalker.php

替換walkDeleteClause函數,如下所示:

public function walkDeleteClause(AST\DeleteClause $deleteClause) 
    { 
     $class = $this->em->getClassMetadata($deleteClause->abstractSchemaName); 
     $tableName = $class->getTableName(); 
     $sql = 'DELETE FROM ' . $this->quoteStrategy->getTableName($class, $this->platform); 
     $this->setSQLTableAlias($tableName, $tableName, $deleteClause->aliasIdentificationVariable); 
     $this->rootAliases[] = $deleteClause->aliasIdentificationVariable; 
     //check if SoftDeleteableListener is attached 
     foreach ($this->em->getEventManager()->getListeners() as $eventName => $listeners) { 
      foreach ($listeners as $listener) { 
       if ($listener instanceof \Gedmo\SoftDeleteable\SoftDeleteableListener) { 
        $date = date('Y-m-d H:i:s'); 
       $sql = 'UPDATE ' . $this->quoteStrategy->getTableName($class, $this->platform) . " SET deletedAt = ' " . $date . " ' "; 
       } 
      } 
     } 
     return $sql; 
    } 

但真的,但我認爲肯漢內爾方式更專業,達到標準。