【问题标题】:Symfony2: How to filter the options of an entity-choice form field by a certain attribute?Symfony2:如何通过某个属性过滤实体选择表单字段的选项?
【发布时间】:2014-05-18 12:03:33
【问题描述】:

1.) 情况(简体)

我有两个实体:一个容器实体,它正好有 1 个内容实体。 content_id 存储在 Container-entity 中。

2.) 软删除内容实体

我实现了一个软删除内容实体的功能,因此我为内容实体添加了一个“已删除”属性。一切正常。

3.) 问题

现在,当我想创建一个新的容器实体时,自动生成的选项会显示所有内容实体——即使是那些我“标记为已删除”的内容实体(删除属性 = 1)。

4.) 问题

添加“过滤器”/“查询”以仅显示未标记为已删除的元素的正确位置在哪里? (删除!= 1)

5.) 我试过的方法

a.) view/twig 方法:我尝试修改 {{ form_widget(form.contentId) }} 的渲染,但没有成功

b.) 控制器方法: 我试图在创建表单的 newAction 中操作表单数据($form = $this->createCreateForm( $entity)) 没有成功

c.) type/buildForm 方法:我尝试更改 buildForm() 方法...再次,没有成功

如果你能给我一个提示和/或一个简短的代码示例,我可以在其中挂钩以删除软删除的选项,那就太好了。

非常感谢您!

【问题讨论】:

    标签: symfony doctrine-orm doctrine symfony-forms symfony-2.4


    【解决方案1】:

    您正在寻找实体字段的 query_builder 选项。

    您可以创建一个自定义查询来过滤其中的结果集。

    示例:

    $builder->add('users', 'entity', array(
        'class' => 'AcmeHelloBundle:User',
        'query_builder' => function(EntityRepository $repository) {
            $qb = $repository->createQueryBuilder('u');
            // the function returns a QueryBuilder object
            return $qb
                // find all users where 'deleted' is NOT '1'
                ->where($qb->expr()->neq('u.deleted', '?1'))
                ->setParameter('1', '1')
                ->orderBy('u.username', 'ASC')
            ;
        },
    ));
    

    您也可以采用更通用的方法,使用 doctrine filters 过滤所有选择语句。

    【讨论】:

    • 非常感谢您的回复!这看起来非常好,我刚刚实现了它。首先我对 WHERE 子句有一点问题,所以我用一个简单的 ->where('u.deleted = 1') 替换它。现在错误消失了,但过滤器不适用! :-( 即使是“独立” ->orderBy('u.username', 'DESC') 也没有任何效果。我不知道在哪里看,因为我没有收到任何错误...你有没有想法?
    • 您清除缓存了吗?也许旧的结果集仍在缓存中。
    • ...我使用了错误的实体! ;-) 现在它完美地工作了!再次感谢您,尼弗尔! :-)
    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多