Symfony的QueryBuilder的返回MongoDB的光标代替对象阵列的(Symfony Q

2019-11-03 21:56发布

我试图建立一个自定义查询函数返回对应的一些滤镜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)

谢谢。

Answer 1:

您需要急于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()方法就足够了,但并不总是工作。



文章来源: Symfony QueryBuilder returning MongoDB cursor instead of objects array