首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Doctrine ODM加载引用文档

Doctrine ODM加载引用文档
EN

Stack Overflow用户
提问于 2011-05-24 05:51:41
回答 3查看 3.1K关注 0票数 0

我的szenario的详细信息,iv'e有一个用户文档:

代码语言:javascript
运行
复制
/** @Document(collection="user") */
class User
{
    /** @Id */
    private $id;

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

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

我得到了一份宠物文档:

代码语言:javascript
运行
复制
/** @Document(collection="pet") */
class Pet
{
    /** @Id */
    private $id;

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

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

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

代码语言:javascript
运行
复制
$result = $this->_dbContainer->getDocumentManager()->getRepository('User')->findBy(array('id' => => 'XZTZHJ323LKFHGJKLHGFGHJK'));
print_r($result->toArray());

...it在无限循环中结束。错误消息:

代码语言:javascript
运行
复制
PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 112721921 bytes) in ...

如果我执行以下代码:

代码语言:javascript
运行
复制
var_dump($result->count());

结果是一个/它存在(一切都好)。$ var_dump ->current()的结果为空。getMongoData方法返回以下数据(正确):

代码语言:javascript
运行
复制
Array ( [0] => Array ( [$ref] => example [$id] => MongoId Object ( [$id] => 4ddac7667294c79e17000002 ) [$db] => test ) )

如果我执行以下代码:

代码语言:javascript
运行
复制
var_dump($result->current());

结果是boolean (false)。

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-24 07:04:50

假设您的模型如下所示

代码语言:javascript
运行
复制
/**
 * @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;
    }
}

您应该能够使用以下命令检索引用的模型

代码语言:javascript
运行
复制
$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()操作。它们包含许多递归引用,尝试将它们呈现为输出会耗尽您的可用内存。

票数 0
EN

Stack Overflow用户

发布于 2011-10-26 23:15:43

尝试重新生成加水器类。

票数 1
EN

Stack Overflow用户

发布于 2011-05-25 14:51:48

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

代码语言:javascript
运行
复制
$pets = $this->user->getPets();     
if(!is_null($pets) && $pets->count() > 0) {
   $this->pet = $pets->first();
}

最大的学习(感谢@Phil):

不要尝试对模型代理对象执行var_dump()或print_r()操作。它们包含许多递归引用,尝试将它们呈现为输出会耗尽您的可用内存。

致以最好的问候,斯蒂芬

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6103483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档