2012-03-31 2 views
3

В настоящее время я использую DoctrineMongoDbBundle для запросов к моей базе данных mongodb.mongoDB Symfony2 возвращает loggablecursor вместо моих объектов.

Вот вызов в мой контроллер:

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
    $entities = $dm->getRepository('MyBundle:Animal')->findBy(array("prop" => "1")); 

    echo print_r($entities->getQuery()); 
    echo printf(count($entities)); 
    echo get_class($entities); 

Тогда я попытался сериализации $ enitities в формате JSON и отправить его клиенту, но он не работал.

В вторит отпечатанные:

Array ([prop] => 1) 
101 
Doctrine\ODM\MongoDB\LoggableCursor0 

Это означает, что запрос является правильным, но количество должно быть «2» и тип должен быть массив животных.

Почему репозитория возвращает LoggableCursor0 вместо массива Animal?

Как он мог вернуть массив животных?

[edit] Что было бы лучшим способом вернуть мой результат в JSON?

ответ

3

findBy returns Курсор в MongoDB ODM в отличие от доктрины orm.

Try:

echo printf($entities->count()); 
+0

Есть ли способ, чтобы получить объекты, как ОРМ делает? Как? –

+0

@ Антон: +1, это мой вопрос –

+0

@ АнтонБабенко. Нет способа. Хотя курсор итерабельен, и вы можете создать свой собственный массив объектов, но в большинстве случаев вам не нужно заботиться об этом. – meze

7

метод использования toArray(). Как это:

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
$entities = $dm->getRepository('MyBundle:Animal')->findBy(array("prop" => "1"))->toArray(); 

Если вам нужно получить массив сущностей, используйте array_values() функцию. Как это:

$entities = array_values($entities); 
+0

Правда. Хотя для этого вам нужна веская причина. – meze

+0

Причина в том, что я использовал ORM в этом проекте и имел петли через сущности. Теперь я перенес проект в ODM и не хочу иметь дело с переписыванием просмотров :) –

+0

Но вы можете посмотреть Курсор, не так ли? – meze

0

Если вы хотите немного больше гибкости при сохранении объектов в виде массива Вы можете сделать это

$dm = $this->get('doctrine.odm.mongodb.document_manager'); 
$animalLoggableCursors = $dm->getRepository('MyBundle:Animal')->findBy(array("prop" => "1")); 

$animals = array() 
while ($animal = $animalLoggableCursors->getNext()) { 
    if ($animal->getSomeProperty() == $someValue) 
     array_push($animals, $animal) 
} 
Смежные вопросы