datagrid过滤关系对象作为symfony 2.4中sonata admin的文本字段(而不是下拉列表)

时间:2014-04-08 08:55:22

标签: symfony sonata-admin symfony-2.4

我的实体'Action'与'User'有关。在SonataAdminBundle中创建了Admin CRUD控制器。除了用户过滤器呈现为下拉列表外,一切正常。我有8k用户数并且在增长,所以你必须明白为什么这是一个问题 我希望用户过滤器为文字输入,然后提交给LIKE %username%进行搜索

现在我添加了这样的用户过滤器 - $datagridMapper->add('user')

我知道我可以添加过滤器类型和字段类型,但我无法找到正确的组合和选项。找到有关http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html的信息但仍未成功。

最终解决方案

按照Alex Togo的回答我使用了这段代码:

$datagridMapper->add('user', 'doctrine_orm_callback', array(
'callback' => function($queryBuilder, $alias, $field, $value) {
    if (empty($value['value'])) {
        return;
    }
    $queryBuilder->leftJoin(sprintf('%s.user', $alias), 'u');
    $queryBuilder->where('u.username LIKE :username');
    $queryBuilder->setParameter('username', '%'.$value['value'].'%');
    return true;
},
'field_type' => 'text'
))

2 个答案:

答案 0 :(得分:5)

我在项目上需要这样的东西。我使用this实现了此功能。您可以尝试将'field_type'选项设置为'text'(我在我工作的项目中使用'choice')并添加您需要过滤的querybuilder操作。

答案 1 :(得分:4)

使用 doctrine_orm_choice 选项。

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add(
            'module',
            'doctrine_orm_choice',
            [],
            'choice',
            [
                'choices' => $this->filterModuleList
            ]
        )

        ....