尽管在数据库中不为空,但Doctrine返回MongoDB对象中的数组字段为空

时间:2019-05-20 09:13:04

标签: php mongodb symfony doctrine

我正在开发一个Symfony应用程序,该应用程序使用MongoDB和Doctrine将应用程序与数据库连接。 但是现在我向其中一个文档中添加了一个集合字段,但是当我通过PHP从数据库中查询该字段时,该字段的内容始终为空,尽管当我直接在MongoDB Shell中将其返回时,该字段的内容并不为空。

更详细地: 我在现有文档“用户”中添加了一个新字段“ loginLast90Days”,以将时间整数存储在数组中:

<?php

namespace AppBundle\Document;

use Doctrine\Bundle\MongoDBBundle\Validator\Constraints\Unique as MongoDBUnique;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @MongoDB\Document(collection="users")
 * @MongoDBUnique(fields="{id, email}")
 */
class User
{
   // ...
   /**
     * @MongoDB\Field(type="collection")
     */
    protected $loginLast90Days;

    // ...

    /**
     * Set loginLast90Days
     *
     * @param collection $loginLast90Days
     * @return $this
     */
    public function setLoginLast90Days($loginLast90Days)
    {
        $this->loginLast90Days = $loginLast90Days;
        return $this;
    }

    /**
     * Get loginLast90Days
     *
     * @return collection $loginLast90Days
     */
    public function getLoginLast90Days()
    {
        return $this->loginLast90Days;
    }

    public function addLoginLast90Days($login)
    {
        $this->loginLast90Days[] = $login;
        return $this;
    }

    public function removeLoginLast90Days($login)
    {
        $this->loginLast90Days->removeElement($login);
        return $this;
    }

    // ...
}

现在我可以将日期整数添加到其中一个用户对象:

$dm = $this->get('doctrine_mongodb');

            $user = $dm->getRepository('AppBundle:User')->findOneBy(array('gmail' => $email));

$user->addLoginLast90Days(time());

$dm = $this->get('doctrine_mongodb')->getManager();
$dm->persist($user);
$dm->flush();

现在,当我使用Mongo Shell找到对象时,可以在字段中看到新值。 但是,下次我向对象添加值时,PHP中的数组为空,尽管我可以在数据库中看到它不应为空。

有人知道我的错误在哪里吗?我忘记将字段正确映射到数据库了吗?

非常感谢!

编辑: 这是用户文档的构造函数:

public function __construct($customerId, $refreshToken, $canManageCustomers)
    {
        $this->customerId = $customerId;
        $this->refreshToken = $refreshToken;
        $this->canManageCustomers = $canManageCustomers;
        $this->isActive = true;
        $this->accountLevel = "basic";
        $this->isRegistered = false;
        $this->createdAt = new \MongoDate();
    }

1 个答案:

答案 0 :(得分:0)

尝试将您的loginLast90Days初始化为数组,

在构造函数中初始化属性loginLast90Days

public function __construct()
    {
        //Whatever you had here...
        $this->loginLast90Days = [];
    }