В настоящее время я работаю со структурой данных, которая использует узлы в таблице узлов. Это самоссылка, в которой есть столбец id и parent_id. Родительско-дочерние отношения один-ко-многим. Это означает, что несколько узлов могут иметь один и тот же parent_id. Это также может переходить вниз на переменное количество уровней.
Проблема в том, что я не могу просто удалить родителя, так как это не удается из-за ограничения внешнего ключа. Это хорошо, потому что я не хочу, чтобы дети осиротели. Однако это означает, что я должен рекурсивно проходить через детей до тех пор, пока не доберусь до самого нижнего уровня, удалить этого ребенка и затем вернуться обратно.
Мне пока не повезло. Это моя «лучшая» попытка, но массив toRemove всегда оказывается пустым, когда я его сбрасываю.
/**
* @var array
*/
private $toRemove;
/**
* constructor.
*
* @param array $toRemove
*/
public function __construct(
EntityManagerInterface $entityManager,
array $toRemove = []
)
{
$this->toRemove = $toRemove;
}
someMainFunc(blabla)
{
foreach ($nodes as $node) {
$this->removeChildrenFromLowestLevelUp($node)
}
dump($this->toRemove);die;
}
public function removeChildrenFromLowestLevelUp(Node $node)
{
if (null === $node->getChildren()) {
// Node has no children, add to toRemove array
$this->toRemove[] = $node;
}
/** @var Node $child */
foreach ($node->getChildren() as $child) {
$this->removeChildrenFromLowestLevelUp($child);
}
}
Я знаю, что есть множество решений для этого на inte rnet, но я не могу заставить любого из них сделать это так, как я хочу.
Спасибо за любую помощь!