我有一个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:
然后我再次尝试了应用程序并且它正常工作。我不知道为什么。
答案 0 :(得分:2)
我刚遇到这个问题并快速查看一下doctrine mongodb的实现。
Doctrine在运行时创建一些水合器类(感谢类Doctrine\ODM\MongoDB\Hydrator\HydratorFactory
)并将结果存储在缓存中。缓存是在第一个请求上构建的,然后使用缓存。这就是为什么你有这种奇怪的行为和决心。
缓存的简单重置解决了这个问题:
php app/console cache:clear
答案 1 :(得分:0)
正如我在尝试使用自定义Symfony的app/console
函数进行调试以检索数据后在问题中所述,事情开始起作用。
我不知道为什么,所以...... :(