Sonata Admin MongoDB DataGrid过滤器

时间:2016-02-17 07:57:40

标签: mongodb symfony doctrine sonata-admin

场合

我们正在运行Symfony 2.8和最新版本的Sonata Admin以及Mongo作为数据存储。请考虑以下为此问题而简化的对象;它确实有用。

class Entry
{
    /* @ID */
    protected $id;
    /* @String */
    protected $type;
    /* @String */
    protected $content;
}

有了上述内容,会有很多条目,我们希望按照类型过滤。

这是数据集

的一个示例

example dataset

问题

我们无法在dataGrid函数中创建一组可选择的过滤器,这些过滤器对于类型是唯一的。

尝试

请注意,在需要时,EntryRepository作为名称空间包含在文件的开头

NUMBER 1

通过以下内容,我们可以多次复制类型

->add('type', null, array(), 'document', array(
    'expanded' => true,
    'class' => 'Application:Entry',
    'query_builder' => function(EntryRepository $dr) { 
        return $dr->createQueryBuilder();
    }
))

first attempt

NUMBER 2

使用以下内容,我们只收到错误" string"的500错误。我认为这是因为当使用distinct时,Mongo准备了一组数组而不是未执行的QueryBuilder对象?

->add('type', null, array(), 'document', array(
    'expanded' => true,
    'class' => 'Application:Entry',
    'query_builder' => function(Entryepository $dr) { 
        return $dr->createQueryBuilder()
        ->distinct('type');
    }
))

second attempt

NUMBER 3

下面的尝试是使用Map reduce来执行SQL" GROUP BY"但是,提供了与上述相同的STRING错误。

->add('type', '', array(), 'document', array(
    'expanded' => true,
    'class' => 'Application:Entry',
    'query_builder' => function(EntryRepository $dr) {
        return $dr->createQueryBuilder()
            ->group(array(), array('type'))
            ->reduce('function (obj, prev) { prev.type; }');
        }
     ))

CRUDE WORKAROUND ...气馁

以下是使用过滤器的演示(如Sonata文档中所列),并且它一次只能用于一种类型。

->add('type', 'doctrine_mongo_callback', array(
    'callback' => function($queryBuilder, $alias, $field, $value) {
        if (!$value || $value['value'] == false) {
            return true;
        }
        $queryBuilder
           ->field('type')->equals('fds');
           return true;
    },
    'field_type' => 'checkbox'
))

采用这种方法,我认为我必须继续查询整个数据集,获取类型的不同值,然后围绕每个构建过滤器循环。这样可行但却非常混乱。

问题

什么是最佳实践"在不将代码变成红润的情况下执行此操作的方法?将查询放入存储库仍然会产生类似的效果吗?

感谢您阅读

1 个答案:

答案 0 :(得分:0)

我正在为可能面临同样问题的其他人发布答案。我意识到我正在从错误的角度接近这种情况,而不是上述任何一种,做了以下

_G