Чтение загруженного рекурсивного дерева OneToMany

Я пытаюсь сделать интеграционные тесты с Алиса и некоторые приспособления, включающие рекурсивное двунаправленное отношение.

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

Я что-то пропустил ? Как я могу найти своих детей обратно?

2

Решение

Поскольку фиксатор не сохраняется, Алиса может полагаться только на то, как реализованы сеттеры / сумматоры.

Если необходимо добавить дочерние узлы:

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;
}

Я думаю, что мы могли бы даже сделать какой-то трюк для управления обоими случаями, избегая рекурсивности

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]