仍然会在除了一个的所有上下文中返回已删除的实体

我有一个Doctrine实体( FieldOption ),它表示一个表单中选择字段的单个选项(例如RedGreenBlue )。 用户在任何时候都可以选择从字段中删除选项(例如,删除Green ),为此,我已经使用Gedmo将该实体设置为可删除的,该Gedmo完美地工作。

但是,如果至少存储一次表单提交的选项被删除,则该提交实体(与FieldOption实体有关系)无法加载,因为FieldOption被过滤掉。 实际上,我只想在返回呈现表单的数据时发生软删除功能 - 查看链接到该实体的现有记录应该仍然能够默认加载软删除的选项。

有没有办法通过另一个实体检索时禁用此过滤器,但要确保在直接加载选项列表时启用过滤器?


Sepultura评论的链接提供了一些关于如何启用/禁用过滤器和编写自己的自定义过滤器的示例。

来自文档

示例过滤器:

<?php
namespace Example;
use DoctrineORMMappingClassMetaData,
    DoctrineORMQueryFilterSQLFilter;

class MyLocaleFilter extends SQLFilter
{
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        // Check if the entity implements the LocalAware interface
        if (!$targetEntity->getReflectionClass()->implementsInterface('LocaleAware')) {
            return "";
        }

        return $targetTableAlias.'.locale = ' . $this->getParameter('locale'); // getParameter applies quoting automatically
    }
}

该文档还声明使用以下代码行添加此过滤器(以便您可以启用/禁用它):

$config->addFilter("locale", "DoctrineTestsORMFunctionalMyLocaleFilter");

然而,如果你想在任何地方使用这个过滤器,你必须把这行代码放到你想要的位置,并且还可以访问$config (它包含来自Doctrine的Configuration对象)。

在Zend Framework 2和3中,您可以将以下配置添加到核心/ mvc模块或应用程序配置中:

'doctrine' => [
    'configuration' => [
        'orm_default' => [
            'filters' => [
                'locale' => MyLocaleFilter::class,
            ],
        ],
    ],
],

上面的代码和配置行启用了此过滤器,可以在特定位置禁用,在您要禁用的位置使用以下行(每个文档(第一个启用&配置)):

<?php
$filter = $em->getFilters()->enable("locale");
$filter->setParameter('locale', 'en');

// Disable it
$filter = $em->getFilters()->disable("locale");
链接地址: http://www.djcxy.com/p/65041.html

上一篇: still return deleted entity in all contexts except one

下一篇: SoftDelete JTI Entity with associations