我正在尝试构建一个自定义查询函数,返回与某些过滤器对应的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 :(得分:1)
您需要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()方法就足够了,但并不总是有效。