Doctrine:劫持删除操作并使记录无效

时间:2016-07-14 17:32:31

标签: doctrine-orm symfony

为了避免使用Slowly Changing Dimension problem(简而言之:即使用户从系统中删除,我也要保留订单数据),我想到了劫持delete事件而不是设置记录上有invalid个标记。

  • 我知道来自StofDoctrineExtensionsBundle的softdeletable过滤器,但我不确定它是否会级联到子对象。

  • 这是一个常见/良好的做法/想法,并使用以下生命周期回调执行此操作?:

/

/**
 * @ORM\PreRemove
 */

public function makeInvalid() {
    $this->enddate = new \DateTime(); // set the end of validity property to now
    cascadeToRelatedObjects(); // i.e. make sure all 'child' objects also change validity
    somehowContinueTheOperation(); // i.e. do not cause an Error of sorts
}
  • 或者我应该更改表单上删除按钮的功能,并为其分配更新功能以实现上述功能?

1 个答案:

答案 0 :(得分:0)

事实上,使用softdeleteable中的DoctrineExtensions是可行的方法。如果您在拥有对象的属性上正确设置cascade={"remove"}选项(通常是使用OneToMany的那个),它甚至可以级联。

如果我错了,请纠正我,但我认为你不需要设置onDelete="CASCADE",因为这是由数据库执行的功能,它不知道软删除的要求,所以它不会软删除任何孩子。

我获得此扩展程序的最简单方法是使用命令StofDoctrineExtensionsBundle安装composer require StofDoctrineExtensionsBundle并在config.yml中对其进行配置,您可以按照以下说明使用它。软删除Device的实例也将软删除其依赖Parts

为了恢复它们,你可能需要编写一个函数或其他东西。

use Gedmo\Mapping\Annotation as Gedmo;

/**
 * ...
 * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
 */

class Device {
    /**
     * @ORM\Column(name="deletedAt", type="datetime", nullable=true)
     */
    private $deletedAt;

    /**
     * @ORM\OneToMany(targetEntity="Part", mappedBy="device", cascade={"persist","remove"})
     */
    private $parts;
}