Я пытаюсь сделать интеграционные тесты с Алиса и некоторые приспособления, включающие рекурсивное двунаправленное отношение.
class Node
{
/** [...]
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/** [...]
* @ORM\Column(name="name", type="string", length=100, nullable=false)
*/
private $name;
/** [...]
* @ORM\ManyToOne(targetEntity="Node", inversedBy="children")
*/
private $parent;
/** [...]
* @ORM\OneToMany(targetEntity="Node", mappedBy="parent")
*/
private $children;
// ...
public function addChild(Node $child)
{
$this->children[] = $child;
$child->setParent($this);
return $this;
}
public function removeChild(Node $child)
{
$this->children->removeElement($child);
$child->setParent(null);
}
// ...
Загрузка этого приспособления хорошо управляется:
AppBundle\Entity\Node:
Node-0:
name: 'Trunk'
Node-1:
name: 'Branch 1'
parent: '@Node-0'
Node-2:
name: 'Branch 2'
parent: '@Node-0'
Я вижу родителя:
$loader = new NativeLoader();
$fixtures = $loader->loadFile('node.yml')->getObjects();
echo $fixtures['Node-1']->getParent()->getName();
дает
Хобот
Но дети, похоже, не населены
echo count($fixtures['Node-0']->getChildren());
0
Я что-то пропустил ? Как я могу найти своих детей обратно?
Поскольку фиксатор не сохраняется, Алиса может полагаться только на то, как реализованы сеттеры / сумматоры.
Если необходимо добавить дочерние узлы:
AppBundle\Entity\Node:
Node-0:
name: 'Trunk'
children: ['@Node-1', '@Node-2']
Node-1:
name: 'Branch 1'
Node-2:
name: 'Branch 2'
Это путь:
public function addChild(Node $child)
{
$this->children[] = $child;
$child->setParent($this);
return $this;
}
public function removeChild(Node $child)
{
$this->children->removeElement($child);
$child->setParent(null);
}
Если родительский элемент определен в приборе:
AppBundle\Entity\Node:
Node-0:
name: 'Trunk'
Node-1:
name: 'Branch 1'
parent: '@Node-0'
Node-2:
name: 'Branch 2'
parent: '@Node-0'
Родительский сеттер должен быть реализован так:
public function setParent(Node $parent)
{
$parent->addChild($this);
$this->parent = $parent;
return $this;
}
Я думаю, что мы могли бы даже сделать какой-то трюк для управления обоими случаями, избегая рекурсивности
Других решений пока нет …