Doctrine ODM with MongoDB 需要两个参考映射集

Posted

技术标签:

【中文标题】Doctrine ODM with MongoDB 需要两个参考映射集【英文标题】:Doctrine ODM with MongoDB need both reference mappings set 【发布时间】:2013-12-09 13:28:59 【问题描述】:

我在使用 MongoDB 和 Symfony 2.x 的原则 ODM 中遇到以下情况

A类:

class Port extends AbstractEthernetPort

/** Other Fields **/

/**
 * Owning the reference
 * @MongoDB\ReferenceOne(
 *     targetDocument="\xxx\AbstractObject",
 *     cascade="all",
 *     inversedBy="ports"
 * )
 */
protected $device;

/** SETTER and GETTERS **/


B类:

class Device extends AbstractObject

/** Other Fields **/

/**
 * @MongoDB\ReferenceMany(
 *     targetDocument="\xxx\AbstractEthernetPort",
 *     cascade="all",
 *     mappedBy="device"
 * )
 */
protected $ports = array();

/** SETTER and GETTERS **/

这两个类都与 ReferenceOne 和 ReferenceMany 链接在一起。这篇文章的代码略有改动。

这是测试用例的两个版本。第一个不起作用,第二个起作用:

    public function testPorts() 
    $dm = self::$container->get('doctrine_mongodb')->getManager();

    $sideASwitch = new Device();
    $sideASwitch->setName("Switch01");

    $copper1 = new Port();
    $copper1->setDescription("Copper Port");

    $copper2 = new Port();
    $copper2->setDescription("Copper Port");

    $sideASwitch->setPorts(array($copper1, $copper2));

    $dm->persist($sideASwitch);

    $dm->flush();

    $x = $dm->getRepository("Device")->findOneBy(array());
    \Doctrine\Common\Util\Debug::dump($x,1);
    

最后的查询返回一个内容为0的ports数组。

    public function testPorts() 
    $dm = self::$container->get('doctrine_mongodb')->getManager();

    $sideASwitch = new Device();
    $sideASwitch->setName("Switch01");

    $copper1 = new Port();
    $copper1->setDescription("Copper Port");

    $copper2 = new Port();
    $copper2->setDescription("Copper Port");

    // ADDITIONAL
    $copper1->setDevice($sideASwitch);
    $copper2->setDevice($sideASwitch);

    $sideASwitch->setPorts(array($copper1, $copper2));

    $dm->persist($sideASwitch);

    $dm->flush();

    $x = $dm->getRepository("Device")->findOneBy(array());
    \Doctrine\Common\Util\Debug::dump($x,1);
    

此查询返回一个包含 2 个对象的端口数组...

这是 Doctrine ODM 中的正常行为还是我做错了什么?

感谢您的帮助

【问题讨论】:

【参考方案1】:

这是预期的行为。调用$sideASwitch->setPorts(array($copper1, $copper2)); 无效,因为ports 是映射端。

为方便起见,我经常在映射 (Device) 端执行以下操作:

public function setPorts(array $ports)

    foreach($ports as $port) 
        $port->setDevice($this);
    

    return $this;

【讨论】:

以上是关于Doctrine ODM with MongoDB 需要两个参考映射集的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine ODM:如何选择Mongodb数据库

通过 mongodb/doctrine2 odm 中的嵌套引用值查询

Doctrine MongoDB 在没有 ODM 的情况下使用

Doctrine MongoDB 在没有 ODM 的情况下使用

Doctrine 2 ODM MongoDB 从内存中将图像存储在 GridFS 中

使用 Doctrine MongoDB ODM 进行地理空间查询