Symfony2 と DoctrineMongoDBBundle を使用して、MongoDB でリレーションを使用しようとしています。Doctrine MongoDB Object Document Mapper プレゼンテーションのスライド 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;
}
}
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;
}
}