Symfony2:如何通过某个属性过滤实体选择表单字段的选项?

时间:2014-05-18 12:03:33

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

1。)情况(简化)

我有两个实体:一个Container实体,它只有一个Content-entity。 content_id存储在Container-entity中。

2.)软删除内容实体

我实现了一个软删除内容实体的功能,所以我在Content-entity中添加了一个“已删除”的属性。一切正常。

3。)问题

现在,当我想创建一个新的Container实体时,自动生成的选项显示所有内容实体 - 甚至是那些我“标记为已删除”的实体(delete-attribute = 1)。

4.。)问题

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

5。)我尝试了什么

a。)view / twig方法: 我试图修改{{form_widget(form.contentId)}}的呈现但没有成功

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

c。)type / buildForm方法: 我试图改变buildForm() - 方法......再次,没有成功

如果你能给我一个提示和/或一个简短的代码示例,我可以在哪里勾选到删除软删除选项的动作,那将是伟大的。

非常感谢你!

1 个答案:

答案 0 :(得分:20)

您正在寻找实体字段的 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 过滤所有选择语句。