1

在我的 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');
}

错误:

注意:未定义索引:../vendor/sonata-project/doctrine-mongodb-admin-bundle/Sonata/DoctrineMongoDBAdminBundle/Builder/DatagridBuilder.php 第 60 行中的 device.os

我想这是有道理的..即使我创建了该索引,也不会返回任何内容..(顺便说一下,我从这里得到了这个想法:请参阅显示子实体属性

问题:

如何自定义有关设备操作系统版本的过滤器,以便它包含与设备文档相关的信息。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超类的方法Admin可以被覆盖..但似乎这是全局的,在这种特定情况下它对我没有帮助。

4

0 回答 0