В моем MongoDB я получил документ passenger, это типичный элемент:
{
"_id" : ObjectId("51efdf818d6b408449000002"),
"createdAt" : 1374674817,
"phone" : "222222",
..
}
У меня также есть документ device, который ссылается на документ passenger, вот пример:
{
"_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 в ../vendor/sonata-project/doctrine-mongodb-admin-bundle/Sonata/DoctrineMongoDBAdminBundle/Builder/DatagridBuilder.php, строка 60.
что, я думаю, имеет смысл.. и даже если я создам этот индекс, ничего не будет возвращено.. (кстати, я получил эту идею от здесь: см. отображаемую подсущность характеристики
вопрос:
как я могу настроить фильтр в отношении версии ОС устройства, чтобы он включал информацию, связанную с документом устройства. Позвольте мне показать, что я хочу сделать, используя этот пример (смесь кода и псевдокода):
->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
может быть переопределен.. но кажется, что это глобально так, и это не поможет мне в этом конкретном случае.