Задать вопрос

Symfony2 DoctrineMongoDBBundle one-to-many двунаправленные ссылки?

В презентации Doctrine MongoDB Object Document Mapper (слайд 47) объекту User присваивается Организация, и у этой организации в массиве Users автоматически появляется на него ссылка, что видно на 49 слайде.

В документации сказано, что я должен использовать опции inversedBy и mappedBy.

У меня такая же зависимость(User и Groups) и я хочу повторить это, однако у меня не получается добиться автоматического обновления ссылок у зависимых объектов, далее код:



$Group = new \MyVendor\MongoBundle\Document\Group();<br>
$User = new \MyVendor\MongoBundle\Document\User();<br>
$User->setGroup($Group);<br>
/** @var \Doctrine\ODM\MongoDB\DocumentManager $dm */<br>
$dm = $this->get('doctrine_mongodb')->getManager();<br>
$dm->persist($Group);<br>
$dm->persist($User);<br>
$dm->flush();<br>




Результат в MongoDB:



Group



{
   &quot;_id&quot;: ObjectId(&quot;5043e24acdc2929a0500000d&quot;),
}




User



{
   &quot;_id&quot;: ObjectId(&quot;5043e24acdc2929a0500000c&quot;),
   &quot;group&quot;: {
     &quot;$ref&quot;: &quot;Group&quot;,
     &quot;$id&quot;: ObjectId(&quot;5043e24acdc2929a0500000d&quot;),
     &quot;$db&quot;: &quot;my_db&quot; 
  }
}




src/MyVendor/MongoBundle/Document/User.php



<?php<br>
namespace MyVendor\MongoBundle\Document;<br><br>
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;<br><br>
/**<br>
 * @MongoDB\Document(repositoryClass="MyVendor\MongoBundle\Repository\UserRepository")<br>
 */<br>
class User<br>
{<br>
    /**<br>
    * @MongoDB\Id<br>
    */<br>
    private $id;<br><br>
    /**<br>
     * @var<br>
     * @MongoDB\ReferenceOne(targetDocument="Group", inversedBy="users")<br>
     */<br>
    private $group;<br><br>
    /**<br>
     * Set group<br>
     *<br>
     * @param MyVendor\MongoBundle\Document\Group $group<br>
     * @return User<br>
     */<br>
    public function setGroup(\MyVendor\MongoBundle\Document\Group $group)<br>
    {<br>
        $this->group = $group;<br>
        return $this;<br>
    }<br>
}<br>




src/MyVendor/MongoBundle/Document/Group.php



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




Кросс-вопрос на stackoverflow
  • Вопрос задан
  • 3420 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@nikita2206
Очевидно это задача не датамаппера, а логики ваших сущностей.
<?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;
        $group->addUsers($this);
        return $this;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы