代码之家  ›  专栏  ›  技术社区  ›  levye

使用stofdoctrineextensisbundle[duplicate]生成软删除查询

  •  1
  • levye  · 技术社区  · 7 年前

    我希望,当我执行时,它应该在字段中更新deleted\u DELETE deleted_at is null 选择查询结束的条件。但它确实是用一个愚蠢的条件删除行。怎么了?

    $query = $this->entityManager->createQueryBuilder()
        ->delete("AppBundle:ReportRow", "r")
        ->where("r.date <= :date")
        ->andWhere("r.balance is null")
        ->andWhere("r.name = :name")
        ->setParameters(array("date" => $date->format("Y-m-d"),
                                "name" => $user->getName()))
        ->getQuery();
    
    $output->writeln($query->getSQL());
    

    以下是输出:

    DELETE FROM report_row 
    WHERE (date <= ? AND balance_id IS NULL AND name = ?) 
    AND (report_row.deleted_at IS NULL) // really ?? its delete query dude!
    

    这是我的配置

    doctrine:
        ...
        orm:
            ...
            filters:
                softdeleteable:
                    class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                    enabled: true
    
    stof_doctrine_extensions:
        orm:
            default:
                softdeleteable: true
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Will B.    7 年前

    该问题已提交给开发商,自2014年起,目前尚待解决 https://github.com/Atlantic18/DoctrineExtensions/issues/1125

    当您使用 QueryBuilder 创建 DELETE 声明,您绕过 onFlush $em->remove($entity) 而是手动发出SQL语句。

    结果是,softdeletable过滤器不再管理查询的意图,但仍然知道 deleted_at


    要解决此问题,必须使用查询提示和 SoftDeleteableWalker documentation

    $query = $this->entityManager->createQueryBuilder()
        ->delete("AppBundle:ReportRow", "r")
        ->where("r.date <= :date")
        ->andWhere("r.balance is null")
        ->andWhere("r.name = :name")
        ->setParameters(array("date" => $date->format("Y-m-d"),
                                "name" => $user->getName()))
        ->getQuery();
    
    $query->setHint(\Doctrine\ORM\Query::HINT_CUSTOM_OUTPUT_WALKER,
                \Gedmo\SoftDeleteable\Query\TreeWalker\SoftDeleteableWalker::class);
    
    $output->writeln($query->getSQL());
    

    结果:

    UPDATE report_row 
    SET deleted_at = '2017-10-03 15:06:48'
    WHERE (date <= ? AND balance_id IS NULL AND name = ?)