Symfony2 SoftDeleteable not working on QueryBuilder Delete

前端 未结 2 1788
感情败类
感情败类 2021-01-06 00:49

Softdelete behavior works fine on execute delete statement via the entity manager as the following code:

$entity = $this->em->getRepository(\'Users\')-         


        
相关标签:
2条回答
  • 2021-01-06 01:33

    If you use DQL then you have to use a Query Hint. This should do the trick:

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

    Update:

    The docs mention that you have to use a Query Hint but don't provide an example so I pulled the usage from their tests.

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

    Test Usage: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/tests/Gedmo/SoftDeleteable/SoftDeleteableEntityTest.php

    0 讨论(0)
  • 2021-01-06 01:45

    my old solution after previous answer by @Ken Hannel is:

    Edit: /vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php

    Replace walkDeleteClause function as the following:

     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;
        }
    

    but really but I think Ken Hannel way is more professional and up to standard.

    0 讨论(0)
提交回复
热议问题