Я пытаюсь создать пользовательскую функцию запроса, возвращающую документы MongoDB, соответствующие некоторым фильтрам. Я создал эту функцию в конкретном репозитории для моего документа User
:
namespace LogAnalyzer\CoreBundle\Repository; use Doctrine\ODM\MongoDB\DocumentRepository; class UserRepository extends DocumentRepository { public function getUserTemp($clauses = null) { /* Create query */ $query = $this -> createQueryBuilder(); /* Add clauses */ if($clauses) { if(isset($clauses['id'])) $query -> field('id') -> equals($clauses['id']); if(isset($clauses['firstName'])) $query -> field('firstName') -> equals($clauses['firstName']); if(isset($clauses['lastName'])) $query -> field('lastName') -> equals($clauses['lastName']); if(isset($clauses['email'])) $query -> field('email') -> equals($clauses['email']); if(isset($clauses['password'])) $query -> field('password') -> equals($clauses['password']); } /* Return */ return $query -> getQuery() -> execute(); } }
Вот определение моего User
document:
namespace LogAnalyzer\CoreBundle\Document; use JsonSerializable; use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; use Symfony\Component\Validator\Constraints as Assert; /** * @MongoDB\Document(repositoryClass="LogAnalyzer\CoreBundle\Repository\UserRepository") */ class User implements JsonSerializable { /** * @MongoDB\Id */ protected $id; /** * @MongoDB\String */ protected $firstName; /** * @MongoDB\String */ protected $lastName; /** * @MongoDB\String */ protected $email; /** * @MongoDB\String */ protected $password; ... }
В моем контроллере у меня есть частная функция, использующая функцию запроса:
private function getUserAction() { $manager = $this -> get('doctrine_mongodb') -> getManager(); $repository = $manager -> getRepository('LogAnalyzerCoreBundle:User'); $users = $repository -> getUserTemp(array( 'firstName' => 'First' )); return $users; }
Когда я запускаю функцию, я не получаю массив объектов, как ожидалось, но вместо Doctrine\ODM\MongoDB\Cursor
.
Где моя ошибка?
РЕДАКТИРОВАТЬ:
Должен ли я использовать -> toArray(false)
?
Благодарю.
Вам нужен курсор Mager MongoDB для повторения запросов. Я отредактирую код, чтобы облегчить вам:
class UserRepository extends DocumentRepository { public function getUserTemp($clauses = null) { /* Create query */ $qb = $this->createQueryBuilder()->eagerCursor(true); /* Add clauses */ if($clauses) { // It's a way to initialize the query, you can use a select or something similar $query = $qb->hydrate(true); if(isset($clauses['id'])) $query -> field('id') -> equals($clauses['id']); if(isset($clauses['firstName'])) $query -> field('firstName') -> equals($clauses['firstName']); if(isset($clauses['lastName'])) $query -> field('lastName') -> equals($clauses['lastName']); if(isset($clauses['email'])) $query -> field('email') -> equals($clauses['email']); if(isset($clauses['password'])) $query -> field('password') -> equals($clauses['password']); } /* Return */ return $query -> getQuery() -> execute(); } }
Теперь вы можете повторять результат со всеми результатами в виде объектов внутри.
private function getUserAction() { $manager = $this -> get('doctrine_mongodb') -> getManager(); $repository = $manager -> getRepository('LogAnalyzerCoreBundle:User'); $users = $repository -> getUserTemp(array( 'firstName' => 'First' )); //It's just an example, but here you can see how to get the query result data foreach($users as $user){ $data[] = $user->getFirstName(); } return $users; }
Это лучший способ сделать это, иногда достаточно вызвать метод toArray (), но не всегда работать.