Symfony2&& mongodb简单参考

时间:2012-07-04 15:28:37

标签: mongodb symfony

他们,

我想使用symfony2对mongodb文档做一个简单的参考。

我有这两个文档,并希望将图片引用存储到请求文档中。如果我在请求文档中只有图片ID,它对我有用。

所以我需要以下内容:

每个人都可以更改文档文件并制作和扩展custum调用以从请求(图片数组)中获取所有图片作为对象吗?

我的原始文件:

文件图片:

<?php

namespace TestBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document(repositoryClass="TestBundle\Repository\RequestsRepository")
 */
class Requests
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\String
     */
    protected $title;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }
}

文件图片:

<?php

namespace TestBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document(repositoryClass="TestBundle\Repository\PicturesRepository")
 */
class Pictures
{
    /**
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @MongoDB\String
     */
    protected $filename;

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getId()
    {
        return $this->id;
    }

    public function setFilename($filename)
    {
        $this->filename = $filename;
    }

    public function getTitle()
    {
        return $this->filename;
    }
}

我的基本电话:

$dm = $this->get('doctrine.odm.mongodb.document_manager');
$request = $dm->getRepository('TestBundle:Requests')->find($requestId);

我的测试:

我在请求文件中添加了以下内容:

/**
 * @MongoDB\ReferenceMany(targetDocument="Pictures",cascade={"persist"},simple="true")
 */
protected $pictures = array();
public function setPictures($pictures)
{
    $this->pictures[] = $pictures;
}

public function getPictures()
{
    return $this->pictures;

}

并添加了这样的图片:

$dm     = $this->get('doctrine.odm.mongodb.document_manager');
$photo   = $dm->getRepository('TestBundle:Pictures')->find($photoId);

$dm1 = $this->get('doctrine.odm.mongodb.document_manager');
$request = $dm1->getRepository('TestBundle:Requests')->find($requestId);

$request->setPictures($photo);
$dm1->flush();

这有效 - 但我无法通过加载文档来获取图片。

我要加载的代码:

$dm1 = $this->get('doctrine.odm.mongodb.document_manager');
$request = $dm1->getRepository('TestBundle:Requests')->find($requestId);

$pictures = $request->getPictures();

foreach($pictures as $picture)
{
    print $picture->getId();         
}

这不起作用。我成了跟随错误:

  

致命错误:Doctrine \ ODM \ MongoDB \ Proxy \ ProxyFactory :: getProxy():   打开失败   '... /应用/缓存的/ dev /教义/ ODM /的MongoDB /代理/ _ CG 的_TestBundleDocumentPictures.php'   (include_path ='。:... / library:/ usr / local / zend / share / pear')in   .... /测试/供应商/教义-mongodb的-ODM / LIB /学说/ ODM / MongoDB的/代理/ ProxyFactory.php   在线100

谢谢,jan

2 个答案:

答案 0 :(得分:0)

首先你只需要在$ dm中调用一次你的资源,这就是你的资源超载,这就是不好的做法。一个函数,一个Doctrine调用。其次,你需要$ dm-&gt;持续($ request)然后$ dm-&gt; flush()。在文档之间创建OnetoOne,然后将$ pictures作为Doctrine Array Collection。然后像你尝试的那样设置一张图片,然后进行smiple查询并调用$ request-&gt; getPicture() - &gt; getId()。

答案 1 :(得分:0)

好的,我发现了错误:

在deps文件中,我有以下几行:

[doctrine-common]
    git=http://github.com/doctrine/common.git
    version=2.1.4

[doctrine-dbal]
    git=http://github.com/doctrine/dbal.git
    version=2.1.7

[doctrine]
    git=http://github.com/doctrine/doctrine2.git
    version=2.1.7

将其更新为:

[doctrine-common]
    git=http://github.com/doctrine/common.git
    version=2.2.1

[doctrine-dbal]
    git=http://github.com/doctrine/dbal.git
    version=2.2.1

[doctrine]
    git=http://github.com/doctrine/doctrine2.git
    version=2.2.1

执行php bin/vendors update引用将再次起作用