2017-09-14 54 views
0

我有一个Doctrine实体(FieldOption),它表示表单中的选择字段中的一个单一选项(例如Red,)。用户在任何时候都可以选择从字段中删除选项(例如,删除Green),为此,我使用Gedmo将该实体设置为可软删除,这非常适用。Doctrine软删除 - 仍然返回除一个以外的所有上下文中删除的实体

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

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

+0

也许你可以编写使用Doctring名为sqlfilter(HTTP自己的过滤://docs.doctrine- project.org/projects/doctrine-orm/en/latest/refere NCE/filters.html)? – Sepultura

+0

你是否设法解决这个问题? – Nukeface

+0

我不认为我做了@Nukeface - 考虑它,我不认为这真的是一个真正的软删除的有效用法(因为它应该被视为一个真正的删除),所以我可能会实现一个自定义属性和原则过滤器来处理这个问题 –

回答

0

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

From the docs

实施例过滤器:

<?php 
namespace Example; 
use Doctrine\ORM\Mapping\ClassMetaData, 
    Doctrine\ORM\Query\Filter\SQLFilter; 

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", "\Doctrine\Tests\ORM\Functional\MyLocaleFilter"); 

但是,如果您想要在任何地方使用此过滤器,则必须将此代码行放在所需的任意位置,并且还可以访问$config(其中c来自Doctrine的Configuration对象)。

在Zend框架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"); 
相关问题