3

我对 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()始终返回一个空数组。

编辑:

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

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

编辑2:

之后我再次尝试了该应用程序,它工作正常。我不知道为什么。

4

2 回答 2

2

我刚刚遇到了这个问题,并快速查看了学说 mongodb 的实现。

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

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

php app/console cache:clear
于 2015-04-07T10:53:17.953 回答
0

正如我在尝试使用自定义 Symfony 的app/console函数来检索数据后在问题中所说的那样,事情开始起作用了。

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

于 2013-06-20T16:53:19.947 回答