为了避免使用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
}
答案 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;
}