Php Symfony2/条令-禁用Softdeletable fiter仅每隔一段时间起作用
我使用的是Softdeleteable条令过滤器,但是我有一种从数据库中删除所有记录的方法,该方法应该在删除记录之前禁用过滤器。它似乎只在每隔一段时间运行一次(一旦记录具有deletedAt值)Php Symfony2/条令-禁用Softdeletable fiter仅每隔一段时间起作用,php,symfony,filter,doctrine,soft-delete,Php,Symfony,Filter,Doctrine,Soft Delete,我使用的是Softdeleteable条令过滤器,但是我有一种从数据库中删除所有记录的方法,该方法应该在删除记录之前禁用过滤器。它似乎只在每隔一段时间运行一次(一旦记录具有deletedAt值) 据我所知,softdeleteable过滤器只会在查询中添加选择项或其他内容,因此在删除之前启用和/或禁用它实际上没有任何作用 您需要进行两次尝试删除任何内容的原因是 Gedmo\SoftDeleteable\SoftDeleteableListener 谢谢你的建议。。。但它肯定也会在使用remove
据我所知,softdeleteable过滤器只会在查询中添加选择项或其他内容,因此在删除之前启用和/或禁用它实际上没有任何作用
您需要进行两次尝试删除任何内容的原因是
Gedmo\SoftDeleteable\SoftDeleteableListener
谢谢你的建议。。。但它肯定也会在使用remove()进行删除时添加内容,因为它会截获对此类请求的删除操作,并用deletedAt值的更新替换它们?不,它不会。它不会直接执行DELETE
操作,该操作会被更新所取代。当您删除模型时,ORM会将其安排为删除,然后侦听器会截取该模型,然后使用更新的deletedAt
字段集再次保存该模型。请参阅我的答案以了解更多信息..啊,那么禁用过滤器并不会阻止侦听器执行软删除吗?现在就去拿。再多做一点研究,我就找到了这篇文章,是关于如何真正让它按我所希望的那样工作。。。
<?php
/**
* Created by PhpStorm.
* User: toby
* Date: 08/07/2014
* Time: 17:29
*/
namespace Client\ComponentBundle\Entity;
use Doctrine\ORM\EntityRepository;
abstract class BaseEntityRepository extends EntityRepository
{
/**
* Attempts to delete all records from a table
*
* @param bool $bypassSoftDelete
*
* @return bool
*/
public function deleteAll( $bypassSoftDelete = false )
{
$softdeleteableFilter = 'softdeleteable';
$filters = $this->getEntityManager()->getFilters();
if ($bypassSoftDelete && $filters->isEnabled( $softdeleteableFilter )) {
$filters->disable( $softdeleteableFilter );
}
$entities = $this->findAll();
foreach ($entities as $entity) {
$this->getEntityManager()->remove( $entity );
}
$this->getEntityManager()->flush();
if ($bypassSoftDelete) {
$this->getEntityManager()->getFilters()->enable( $softdeleteableFilter );
}
}
}
/**
* If it's a SoftDeleteable object, update the "deletedAt" field
* and skip the removal of the object
*
* @param EventArgs $args
* @return void
*/
public function onFlush(EventArgs $args)
{
//...
//getScheduledDocumentDeletions
foreach ($ea->getScheduledObjectDeletions($uow) as $object) {
//...
if (isset($config['softDeleteable']) && $config['softDeleteable']) {
$reflProp = $meta->getReflectionProperty($config['fieldName']);
$oldValue = $reflProp->getValue($object);
<!-- THIS BIT -->
if ($oldValue instanceof \Datetime) {
continue; // want to hard delete
}
//...
}
}
}
public function onFlush(EventArgs $args)
{
//..
// Get all entities that are scheduled for deletion
foreach ($ea->getScheduledObjectDeletions($uow) as $object) {
// Check softdeleteable is enabled for model
if (isset($config['softDeleteable']) && $config['softDeleteable']) {
// Get current value of deletedAt
$reflProp = $meta->getReflectionProperty($config['fieldName']);
$oldValue = $reflProp->getValue($object);
// If deletedAt is already set, drop out of update process,
// otherwise continue on with "softdelete"
if ($oldValue instanceof \Datetime) {
continue; // want to hard delete
}
// Dispatch "PRE_SOFT_DELETE" event
$evm->dispatchEvent(
self::PRE_SOFT_DELETE,
$ea->createLifecycleEventArgsInstance($object, $om)
);
// Set deletedAt field to now
$date = new \DateTime();
$reflProp->setValue($object, $date);
// Persist model and schedule for extra update, moving
// model from "scheduledForDeletion" to "scheduledForUpdate"
$om->persist($object);
$uow->propertyChanged($object, $config['fieldName'], $oldValue, $date);
$uow->scheduleExtraUpdate($object, array(
$config['fieldName'] => array($oldValue, $date)
));
// Dispatch "POST_SOFT_DELETE" event
$evm->dispatchEvent(
self::POST_SOFT_DELETE,
$ea->createLifecycleEventArgsInstance($object, $om)
);
}
}
}