Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2/条令-禁用Softdeletable fiter仅每隔一段时间起作用_Php_Symfony_Filter_Doctrine_Soft Delete - Fatal编程技术网

Php Symfony2/条令-禁用Softdeletable fiter仅每隔一段时间起作用

Php Symfony2/条令-禁用Softdeletable fiter仅每隔一段时间起作用,php,symfony,filter,doctrine,soft-delete,Php,Symfony,Filter,Doctrine,Soft Delete,我使用的是Softdeleteable条令过滤器,但是我有一种从数据库中删除所有记录的方法,该方法应该在删除记录之前禁用过滤器。它似乎只在每隔一段时间运行一次(一旦记录具有deletedAt值) 据我所知,softdeleteable过滤器只会在查询中添加选择项或其他内容,因此在删除之前启用和/或禁用它实际上没有任何作用 您需要进行两次尝试删除任何内容的原因是 Gedmo\SoftDeleteable\SoftDeleteableListener 谢谢你的建议。。。但它肯定也会在使用remove

我使用的是Softdeleteable条令过滤器,但是我有一种从数据库中删除所有记录的方法,该方法应该在删除记录之前禁用过滤器。它似乎只在每隔一段时间运行一次(一旦记录具有deletedAt值)


据我所知,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)
            );
        }
    }
}