Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2 DoctrineMongoDBBundle一对多双向引用_Php_Mongodb_Symfony_Doctrine_Dbref - Fatal编程技术网

Php Symfony2 DoctrineMongoDBBundle一对多双向引用

Php Symfony2 DoctrineMongoDBBundle一对多双向引用,php,mongodb,symfony,doctrine,dbref,Php,Mongodb,Symfony,Doctrine,Dbref,我试图在MongoDB中使用关系,使用Symfony2和DoctrineMongoDBBundle 根据报告第49页, 分配$User->setOrganization($Organization),使$Organization::users[0]引用用户对象就足够了。 在示例中,我必须使用inversedBy和mappedBy选项。 我有类似的方案(用户属于组),但我无法同时完成更新工作: $Group = new \MyVendor\MongoBundle\Document\Group();

我试图在MongoDB中使用关系,使用Symfony2和DoctrineMongoDBBundle 根据报告第49页, 分配
$User->setOrganization($Organization)
,使
$Organization::users[0]
引用用户对象就足够了。 在示例中,我必须使用inversedBy和mappedBy选项。 我有类似的方案(用户属于组),但我无法同时完成更新工作:

$Group = new \MyVendor\MongoBundle\Document\Group();
$User = new \MyVendor\MongoBundle\Document\User();
$User->setGroup($Group);
/** @var \Doctrine\ODM\MongoDB\DocumentManager $dm */
$dm = $this->get('doctrine_mongodb')->getManager();
$dm->persist($Group);
$dm->persist($User);
$dm->flush();
MongoDB中的结果:

集团

{
   "_id": ObjectId("5043e24acdc2929a0500000d"),
}
用户

{
   "_id": ObjectId("5043e24acdc2929a0500000c"),
   "group": {
     "$ref": "Group",
     "$id": ObjectId("5043e24acdc2929a0500000d"),
     "$db": "my_db" 
  }
}
src/MyVendor/MongoBundle/Document/User.php

<?php
namespace MyVendor\MongoBundle\Document;

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document(repositoryClass="MyVendor\MongoBundle\Repository\UserRepository")
 */
class User
{
    /**
    * @MongoDB\Id
    */
    private $id;

    /**
     * @var
     * @MongoDB\ReferenceOne(targetDocument="Group", inversedBy="users")
     */
    private $group;

    /**
     * Set group
     *
     * @param MyVendor\MongoBundle\Document\Group $group
     * @return User
     */
    public function setGroup(\MyVendor\MongoBundle\Document\Group $group)
    {
        $this->group = $group;
        return $this;
    }
}

问题是为什么两个文档都需要$refs?这不是一种有效的方法,因为需要分别维护两个对象。如果您确实需要它,那么您需要在两端设置引用

public function setGroup(\MyVendor\MongoBundle\Document\Group $group)
{
    $this->group = $group;
    $group->addUsers($this);
    return $this;
}
第二个选项是仅在其中一个文档上保留$ref。条令会帮你处理所有的工作。要使其工作,您只需设置反向和拥有方(不需要使用
$group->addUsers($this);

对于用户:

* @MongoDB\ReferenceOne(targetDocument="Group", inversedBy="users")
对于组:

* @MongoDB\ReferenceMany(targetDocument="User", mappedBy="group")
而且它总是比演示文稿好用


ps:OP根据这个答案改变了问题。在否决正确答案之前,请查看历史记录。

使用inversedBy和mappedBy可能是我的目标,我已经按照你所指的方式尝试过了,但对我不起作用,可能是出了问题。可能与cascade有关,但我不太确定
* @MongoDB\ReferenceMany(targetDocument="User", mappedBy="group")