我正在尝试使用MongoDB中的关系,使用Symfony2和DoctrineMongoDBBundle根据Doctrine MongoDB对象文档映射器演示的幻灯片49,只要分配$User->setOrganization($Organization)
就足以使$Organization::users[0]
引用到用户对象。文档中说我必须使用invertedBy和mappedBy选项。我有类似的方案(用户属于组),但我不能同时获得更新工作:
$Group = new MyVendorMongoBundleDocumentGroup();
$User = new MyVendorMongoBundleDocumentUser();
$User->setGroup($Group);
/** @var DoctrineODMMongoDBDocumentManager $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 MyVendorMongoBundleDocument;
use DoctrineODMMongoDBMappingAnnotations as MongoDB;
/**
* @MongoDBDocument(repositoryClass="MyVendorMongoBundleRepositoryUserRepository")
*/
class User
{
/**
* @MongoDBId
*/
private $id;
/**
* @var
* @MongoDBReferenceOne(targetDocument="Group", inversedBy="users")
*/
private $group;
/**
* Set group
*
* @param MyVendorMongoBundleDocumentGroup $group
* @return User
*/
public function setGroup(MyVendorMongoBundleDocumentGroup $group)
{
$this->group = $group;
return $this;
}
}
src/MyVendor/MongoBundle/Document/Group.php
<?php
namespace MyVendorMongoBundleDocument;
use DoctrineODMMongoDBMappingAnnotations as MongoDB;
/**
* @MongoDBDocument
*/
class Group
{
/**
* @MongoDBId
*/
private $id;
/**
* @MongoDBReferenceMany(targetDocument="User", mappedBy="group")
* @var User[]
*/
private $users;
public function __construct()
{
$this->users = new DoctrineCommonCollectionsArrayCollection();
}
/**
* Add users
*
* @param MyVendorMongoBundleDocumentUser $users
*/
public function addUsers(MyVendorMongoBundleDocumentUser $users)
{
$this->users[] = $users;
}
}
问题是为什么在两个文档中都需要$refs?这不是一种有效的方法,因为您需要分别维护两个对象。如果你真的需要它,那么你需要在两端设置引用。
public function setGroup(MyVendorMongoBundleDocumentGroup $group)
{
$this->group = $group;
$group->addUsers($this);
return $this;
}
第二种选择是只在其中一个文档上保留$ref。教条将为你处理所有的工作。为了实现这一点,您只需要设置反向和拥有方(不需要使用$group->addUsers($this);
)。
用户:
* @MongoDBReferenceOne(targetDocument="Group", inversedBy="users")
对于组:
* @MongoDBReferenceMany(targetDocument="User", mappedBy="group")
而且,使用文档总是比演示更好。
ps:OP根据这个答案改变了问题。在否决正确答案之前,请查看历史记录