在我的Mongodb中,我收到了乘客文件,这是一个典型的项目:
{
"_id" : ObjectId("51efdf818d6b408449000002"),
"createdAt" : 1374674817,
"phone" : "222222",
..
}
我还有一个设备文档,该文档引用了乘客文档,以下是一个示例:
{
"_id" : ObjectId("51efdf818d6b408449000001"),
"os" : "android.gcm",
"passenger" : ObjectId("51efdf818d6b408449000002"),
..
}
所以换句话说..我无法通过对乘客运行查询来找出属于乘客的设备 ..它必须是一个查询在设备上。
在我的 PassengerAdmin.php 中,我获得了此配置列表字段定义:
public function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name', 'text', array('label' => 'Name'))
->addIdentifier('phone', 'text', array('label' => 'Phone #'))
->addIdentifier('createdAt', 'datetime', array('label' => 'Created At'))
->addIdentifier('device.os', 'text', array('label' => 'Device OS Type'))
..
;
}
工作正常(我不知道奏鸣曲是如何设法将device.os
映射给乘客的......但是很好。)
在我的configureDataGridFilters中,这将返回错误:
protected function configureDatagridFilters(DatagridMapper $datagrid)
{
$datagrid->add('device.os');
}
错误:
注意:未定义的索引:device.os in ../vendor/sonata-project/doctrine-mongodb-admin-bundle/Sonata/DoctrineMongoDBAdminBundle/Builder/DatagridBuilder.php 第60行
我觉得有意义..即使我创建了索引也不会返回任何内容..(顺便说一下,我从here得到了这个想法:看看显示子实体属性
问题:
如何自定义有关设备操作系统版本的过滤器,以便它包含与设备文档相关的信息。 lemme使用这个例子(代码和伪代码的混合)显示我想要完成的事情:
->add('osVersion', 'doctrine_mongo_callback', [
'callback' => function ($queryBuilder, $alias, $field, $params) {
if ($params['value'] === null) {
return;
}
// for each passengers as passenger
// get passenger.id = %passengerID%
// grab device that has passenger = %passengerID%
// filter so that device.os == $params['value']
'field_type' => 'choice',
'field_options' => ['choices'=> ['android.gcm'=> "Android", "os.ios"=>"iOS"]]
]);
我注意到超类createQuery
的{{1}}方法可能是overridden ..但似乎这是全局性的,它不会帮助我具体案例。