у меня есть этот документ:
[_id] => MongoId Object (
[$id] => 542e6f6f10f0ed75138b4567
)
[description] => Lorem...
[lat] => 37.5184124
[lng] => 15.015836000000036
[name] => My company
[phone] => +4977665556
[photos] => Array (
[0] => Array (
[_id] => MongoId Object (
[$id] => 542e6f7a10f0ed73138b4567
)
[image] => 06c2aeb0a8fbc03b7c77732166114a23.jpg
)
[1] => Array (
[_id] => MongoId Object (
[$id] => 542e6f7c10f0ed77138b4568
)
[image] => a7a428c48291137bade2fd81c842c5ab.jpg
)
)
Теперь я хочу получить только массив photos
с доктриной ODM.
Я пробовал этот запрос, но не работает:
$this->createQueryBuilder('Company')
->select('photos')
->field('ID')->equals($id)
->getQuery()
->getSingleResult();
Этот запрос возвращает весь документ не только photos
,
Зачем?
С помощью Builder::select()
Проецирование определенного поля не означает, что запрос вернет это поле в одиночку. Компоновщик запросов Компании всегда будет возвращать объекты Компании. В твоем случае, getSingleResult()
запрос возвращает один объект вместо итеративного курсора объектов Компании. select()
Проекция означает, что запрос MongoDB будет возвращать только _id
а также photos
поля, которые затем будут гидратированы в объект Компании.
В результате вы обнаружите, что Company::getName()
вероятно возвращается null
, в то время как Company::getPhotos()
вероятно возвращает PersistentCollection
фото объектов. Из вашего примера мне неясно, являются ли они ссылочными или просто встроенными документами с _id
поле.
По умолчанию ODM гидратирует результаты запроса. Это может быть проблематично, когда вы используете проекции для исключения полей, поскольку любые дальнейшие назначения для негидратированных полей могут быть выбраны как изменение и сохранены обратно в базу данных. Если вы предпочитаете получать необработанные данные, вы можете отключить гидратацию с помощью Builder::hydrate()
, который принимает логическое значение.
На заметку, я бы предложил вам использовать 'id'
или же '_id'
вместо 'ID'
в вашем field()
запрос. Я не уверен, что ODM выполняет сравнение строк без учета регистра при поиске сопоставленных полей — если, конечно, ваше свойство PHP не является $ID
, в этом случае вы можете игнорировать это предложение.
Других решений пока нет …