如何在Sonata Admin中自定义configureDatagridFilters以使用非相关的mongodb文档

时间:2014-06-27 10:52:21

标签: mongodb symfony sonata-admin symfony-sonata doctrine-mongodb

在我的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 ..但似乎这是全局性的,它不会帮助我具体案例。

0 个答案:

没有答案