2013-12-09 3 views
0

Я, имеющий следующую ситуацию в доктрине ODM с MongoDB и Symfony 2.хдоктрина ODM с MongoDB нужны обе ссылки отображения установить

Класс 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 содержанием.

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 или я делаю что-то не так?

С благодарностью за любую помощь

ответ

0

Ожидаемое поведение. Вызов $sideASwitch->setPorts(array($copper1, $copper2)); не влияет, потому что ports - отображаемая сторона.

для удобства, я часто делаю что-то вроде следующего на отображенной (Device) стороны:

public function setPorts(array $ports) 
{ 
    foreach($ports as $port) { 
     $port->setDevice($this); 
    } 

    return $this; 
} 
Смежные вопросы