无法使用DoctrineMongoDBBundle检索@Collection类型的字段的值

时间:2013-06-20 11:32:24

标签: mongodb symfony doctrine-orm doctrine-mongodb

我有一个MongoDB文档的以下定义(为简洁起见,我删除了部分类):

// src/Acme/UserBundle/Document/User.php
namespace Acme\UserBundle\Document

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\EquatableInterface;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique as MongoDBUnique;

/**
 * @MongoDB\Document()
 * @MongoDBUnique(fields="email", message="This email is already registered")
 */
class User implements UserInterface, EquatableInterface
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\String
     * @Assert\Email(checkMX=true)
     */
    protected $email;

    /**
     * @MongoDB\Collection
     */
    protected $languages = array();
}

接下来,我使用以下命令生成setter和getter:

php app/console doctrine:mongodb:generate:documents UserBundle 

我像往常一样使用User类,一切正常,我可以存储正确存储在mongodb中的用户实例。

使用mongodb的控制台查询,我可以看到对象的存储方式以及languages存储数组:

> db.User.find()
{ "_id" : ObjectId("51c2da8d8b4d24315e9ec3d2"), "email" : "test@test.com", "languages" : [  "en",  "fr" ] }

但是当我尝试检索数据时:

$dm = $this->get('doctrine_mongodb')->getManager();
$user = $dm->getRepository('UserBundle:User')->findOneByEmail('test@test.com');

$user->getEmail()正确返回电子邮件,但$user->getLanguages()始终返回空数组。

编辑:

我设法使用app/console的CLI命令运行查询:

$dm = $this->getContainer()->get('doctrine_mongodb')->getManager();
$user = $dm
    ->getRepository('UserBundle:User')
    ->findOneByEmail('test@test.com');

    print_r($user->getLanguages());

print_r命令的输出是正确的:

Array
(
    [0] => en
    [1] => fr
    [2] => pt
    [3] => es
)

EDIT2:

然后我再次尝试了应用程序并且它正常工作。我不知道为什么。

2 个答案:

答案 0 :(得分:2)

我刚遇到这个问题并快速查看一下doctrine mongodb的实现。

Doctrine在运行时创建一些水合器类(感谢类Doctrine\ODM\MongoDB\Hydrator\HydratorFactory)并将结果存储在缓存中。缓存是在第一个请求上构建的,然后使用缓存。这就是为什么你有这种奇怪的行为和决心。

缓存的简单重置解决了这个问题:

php app/console cache:clear

答案 1 :(得分:0)

正如我在尝试使用自定义Symfony的app/console函数进行调试以检索数据后在问题中所述,事情开始起作用。

我不知道为什么,所以...... :(