Düğümleri taşımak moveAsLastChildOf kullanma

1 Cevap php

Doktrin çalışmak kim hepiniz için, I) moveAsLastChildOf (ile ilgili bir soru var. Ben Doktrini 1.1.6 ve Symfony 1.2 kullanıyorum

Ben elemanları dolu, iç içe geçmiş bir ağaç var. Ben ağacın bir elemanı silmek istiyorsanız, bu yüzden önce ben onun ebeveyn için tüm çocukları (ve kökenini) taşımak zorunda; ve silin. Ben aşağıdakileri yapın:

// Get the parent
$parent = $object->getParent();

if ($object->getNode()->isValidNode())
{
  $children = $object->getNode()->getChildren();
  // Move each child to the parent of this object (grandparent of the children)
  foreach($children as $child){
    $child->getNode()->moveAsLastChildOf($parent);
  }
  // and then delete the element
  $object->getNode()->delete();
}
else
{
  $object->delete();
}

Ama çocuklar bile silinir, çalışmıyor. Ve ben kaldırmak istedim eleman non-sense LFT ve rgt ile DB hala. Örnegin günlüğü:

parent id=2412 lft(2044) rgt(2523) level(5)
to lft(2044) rgt(2523) level(5)

object to delete id=2487 lft(2375) rgt(2384) level(6)
to lft(2375) rgt(2509) level(6) *non deleted and with non-sense lft & rgt*

id=2491 lft(2376) rgt(2377) level(7)
to lft(2521) rgt(2522) level(6)

id=2490 lft(2378) rgt(2379) level(7)
to lft(2376) rgt(2377) level(6) *deleted*

id=2489 lft(2380) rgt(2381) level(7)
to lft(2519) rgt(2520) level(6)

id=2488 lft(2382) rgt(2383) level(7)
to lft(2378) rgt(2379) level(6) *deleted*

Ben Doktrin kodu hızlı bir göz yaptık ve ben yanlış bir şey bulamadım. Ben daha iyi kontrol ettik. Ben bu benim sorunum ya da değil emin olmak için doktrin takım da soracağım.

1 Cevap

Sen çözüm (anahtar ağacı değiştirdiğinizde her düğümü yenilemek için, bu yüzden sadece orijinal düğümü yenilemek sırayla ve sonunda 1 çocuk olsun) olarak kullanabilirsiniz:

    $node = $tag->getNode();
    if ($node->hasParent()) {
        $parent = $node->getParent();

        while ($child = $node->getFirstChild()) {
            $child->getNode()->moveAsLastChildOf($parent);
        }
    } else {
        while ($child = $node->getFirstChild()) {
            $child->getNode()->makeRoot($child->id);
        }
    }
    $tag->refresh()->getNode()->delete();

Ben Doktrini 1.2 kullanıyorum, ama ben hiçbir fark olduğunu düşünüyorum.