Symfony QueryBuilder возвращает курсор MongoDB вместо массива объектов

Я пытаюсь создать пользовательскую функцию запроса, возвращающую документы 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 документ:

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) ?

Благодарю.

0

Решение

Вам нужен курсор Eager 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 (), но это не всегда работает.

1

Другие решения

Других решений пока нет …