场合
我们正在运行Symfony 2.8和最新版本的Sonata Admin以及Mongo作为数据存储。请考虑以下为此问题而简化的对象;它确实有用。
class Entry
{
/* @ID */
protected $id;
/* @String */
protected $type;
/* @String */
protected $content;
}
有了上述内容,会有很多条目,我们希望按照类型过滤。
这是数据集
的一个示例问题
我们无法在dataGrid函数中创建一组可选择的过滤器,这些过滤器对于类型是唯一的。
尝试
请注意,在需要时,EntryRepository作为名称空间包含在文件的开头
NUMBER 1
通过以下内容,我们可以多次复制类型
->add('type', null, array(), 'document', array(
'expanded' => true,
'class' => 'Application:Entry',
'query_builder' => function(EntryRepository $dr) {
return $dr->createQueryBuilder();
}
))
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');
}
))
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'
))
采用这种方法,我认为我必须继续查询整个数据集,获取类型的不同值,然后围绕每个构建过滤器循环。这样可行但却非常混乱。
问题
什么是最佳实践"在不将代码变成红润的情况下执行此操作的方法?将查询放入存储库仍然会产生类似的效果吗?
感谢您阅读
答案 0 :(得分:0)
我正在为可能面临同样问题的其他人发布答案。我意识到我正在从错误的角度接近这种情况,而不是上述任何一种,做了以下
_G