【问题标题】:Doctrine MongoDB ODM load referenced documentsDoctrine MongoDB ODM 加载参考文档
【发布时间】:2014-08-01 20:34:46
【问题描述】:

我的详细情况,我有一个用户文档:

/** @Document(collection="user") */
class User
{
    /** @Id */
    private $id;

    /** @ReferenceMany(targetDocument="Pet") */
    private $pet;

    public function getPet()
    {
        return $this->pet;
    }
}

我得到了一份宠物文件:

/** @Document(collection="pet") */
class Pet
{
    /** @Id */
    private $id;

    /** @ReferenceMany(targetDocument="User") */
    private $user;

    public function getUser()
    {
        return $this->user;
    }
}

多对多相关性。如果我为现有文档调用以下代码...

$result = $this->_dbContainer->getDocumentManager()->getRepository('User')->findBy(array('id' => => 'XZTZHJ323LKFHGJKLHGFGHJK'));
print_r($result->toArray());

...它以无限循环结束。错误信息:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 112721921 bytes) in ...

如果我执行以下代码:

var_dump($result->count());

结果是一个/它存在(一切正常)。 $result->current() 的 var_dump 为 NULL。 getMongoData 方法返回如下数据(正确):

Array ( [0] => Array ( [$ref] => example [$id] => MongoId Object ( [$id] => 4ddac7667294c79e17000002 ) [$db] => test ) )

如果我执行以下代码:

var_dump($result->current());

结果是布尔值(假)。

有什么想法吗?

【问题讨论】:

    标签: php mongodb doctrine-orm doctrine


    【解决方案1】:

    尝试重新生成 hydrator 类。

    【讨论】:

      【解决方案2】:

      如果你的模型看起来像这样

      /**
       * @Document
       */
      class User
      {
          /** @Id */
          private $id;
      
          /** @ReferenceMany(targetDocument="Something") */
          private $somethings;
      
          public function __construct()
          {
              $this->somethings = new \Doctrine\Common\Collections\ArrayCollection;
          }
      
          public function getSomethings()
          {
              return $this->somethings;
          }
      }
      

      您应该能够使用

      检索引用的模型
      $user = $dm->find('User', $id);
      $somethings = $user->getSomethings();
      $firstSomething = $somethings->current(); // will return false if empty, can also use first()
      foreach ($somethings as $something) {
          // and so on
      }
      

      不要尝试var_dump()print_r() 模型代理对象。这些包含许多递归引用,如果尝试将它们呈现为输出,您将耗尽可用内存。

      【讨论】:

      • 抱歉,它对我不起作用,我的属性有以下注释(与您的示例相同的文档结构)/** @ReferenceMany(targetDocument="ExampleReferencedDocument") */ - 结果迭代器->count() 说“1”(它得到了一个结果)但是如果我想用当前得到它,我只会得到 NULL?
      • Doctrine 层存在一些问题...如果我在 PersistentCollection 结果中调用 toArray() 方法,脚本将终止,并且我在错误日志中发现以下消息:PHP 致命错误:允许的内存大小用尽...插入数据库没有任何问题,该死。
      • @Stephan 我已经更新了我的答案,将其更改为 ReferenceMany 模型并添加了更多信息,特别是关于 var_dump()
      • 首先,非常感谢菲尔的支持! :) 不幸的是,更改并未成功结束,我忘记在构造函数中初始化 ArrayCollection 但 $pet->current() 的结果为假,同时 $pet->count() 返回 1 - 一只宠物数据库中也存在正确的引用...我对任何其他建议感到高兴!
      • 对于倾销我建议做\Doctrine\Common\Util\Debug::dump($variable) 这对于倾销学说对象以便阅读它很有用,你可以在它之前做一个
      【解决方案3】:

      从引用集合中获取单个对象的解决方案:

      $pets = $this->user->getPets();     
      if(!is_null($pets) && $pets->count() > 0) {
         $this->pet = $pets->first();
      }
      

      最大的收获(感谢@Phil):

      不要尝试 var_dump() 或 print_r() 模型代理对象。 这些包含许多递归 参考,你会用尽你的 尝试渲染的可用内存 它们作为输出。

      最好的问候, 斯蒂芬

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-11
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多