【问题标题】:Symfony QueryBuilder returning MongoDB cursor instead of objects arraySymfony QueryBuilder 返回 MongoDB 游标而不是对象数组
【发布时间】:2015-10-12 11:57:34
【问题描述】:

我正在尝试构建一个自定义查询函数,返回与某些过滤器相对应的 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) 吗?

谢谢。

【问题讨论】:

标签: php mongodb symfony cursor query-builder


【解决方案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() 方法就足够了,但并不总是有效。

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2016-03-06
    • 2020-04-11
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多