簡體   English   中英

Symfony2 DoctrineMongoDBBundle一對多雙向引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM