[英]Symfony2 DoctrineMongoDBBundle one-to-many Bi-Directional References
我正在嘗試使用Symfony2和DoctrineMongoDBBundle在MongoDB中使用關系。根據Doctrine MongoDB對象文檔映射器演示文稿的幻燈片49,只需分配$User->setOrganization($Organization)
即可使$Organization::users[0]
引用用戶對象。 在文檔中說我必須使用inversedBy和maptedBy選項。 我有類似的方案(用戶屬於組),但是我無法同時進行兩個更新工作:
$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 /文檔/ 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 /文檔/ 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根據此答案更改了問題。 在拒絕正確答案之前,請檢查歷史記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.