Symfony2 DoctrineMongoDB绑定一对多双向引用


Symfony2 DoctrineMongoDBBundle one-to-many Bi-Directional References

我正在尝试使用MongoDB中的关系,使用Symfony2和DoctrineMongoDBBundle根据Doctrine MongoDB对象文档映射器演示的幻灯片49,只要分配$User->setOrganization($Organization)就足以使$Organization::users[0]引用到用户对象。文档中说我必须使用invertedBy和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;
    }
}

src/MyVendor/MongoBundle/Document/Group.php

<?php
namespace MyVendor'MongoBundle'Document;
use Doctrine'ODM'MongoDB'Mapping'Annotations as MongoDB;
/**
 * @MongoDB'Document
 */
class Group
{
    /**
    * @MongoDB'Id
    */
    private $id;
    /**
     * @MongoDB'ReferenceMany(targetDocument="User", mappedBy="group")
     * @var User[]
     */
    private $users;
    public function __construct()
    {
        $this->users = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Add users
     *
     * @param MyVendor'MongoBundle'Document'User $users
     */
    public function addUsers('MyVendor'MongoBundle'Document'User $users)
    {
        $this->users[] = $users;
    }
}

问题是为什么在两个文档中都需要$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根据这个答案改变了问题。在否决正确答案之前,请查看历史记录