繁体   English   中英

Symfony2 SoftDeleteable无法在QueryBuilder上删除

[英]Symfony2 SoftDeleteable not working on QueryBuilder Delete

通过实体管理器在执行delete语句时,Softdelete行为可以正常工作,如下所示:

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

在所有情况下,如何通过实体管理器或查询生成器允许软删除

如果使用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

@Ken Hannel先前的回答后,我的旧解决方案是:

编辑:/vendor/doctrine/orm/lib/Doctrine/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;
    }

但实际上,但我认为Ken Hannel的方法更专业且符合标准。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM