Почему дерево неверно?

У меня есть сущность, которая использует расширение доктрины, поведение дерева, я обнаружил проблемы в дереве и не знаю его причины.

моя сущность:

MyEntity:
    type:  entity
    gedmo:
        tree:
            type: nested
    id:
        id:
            type: integer
            generator:
                strategy: AUTO
    fields:
#        ...
        lft:
            type: integer
            gedmo:
                - treeLeft
        rgt:
            type: integer
            gedmo:
                - treeRight
        lvl:
            type: integer
            gedmo:
                - treeLevel
        root:
            type: integer
            gedmo:
                - treeRoot
        createdAt:
            column: created_at
            type: datetime
            gedmo:
                timestampable:
                    on: create
        updatedAt:
            column: updated_at
            type: datetime
            gedmo:
                timestampable:
                    on: update
    oneToMany:
        children:
            targetEntity: MyEntity
            mappedBy: parent
            orderBy:
                lft: ASC
    manyToOne:
        parent:
            targetEntity: MyEntity
            inversedBy: children
            joinColumn:
                name: parent_id
                referencedColumnName: id
                onDelete: "restrict"
            gedmo:
                - treeParent

проблема дерева:(сообщается методом verify())

  0 => "index [8], duplicate on tree root: 1"
  1 => "index [9], duplicate on tree root: 1"
  2 => "index [20], duplicate on tree root: 1"
  3 => "index [21], duplicate on tree root: 1"
  4 => "node [8], left is greater than right on tree root: 1"
  5 => "node [10] left is less than parent`s [7] left value"
  6 => "node [16] right is greater than parent`s [7] right value"
  7 => "node [19] right is greater than parent`s [6] right value"
  8 => "node [20] right is greater than parent`s [6] right value"
  9 => "node [21] right is greater than parent`s [6] right value"
  10 => "node [22] right is greater than parent`s [6] right value"
  11 => "node [23] right is greater than parent`s [6] right value"
  12 => "node [24] right is greater than parent`s [6] right value"
  13 => "node [31] left is less than parent`s [30] left value"
  14 => "node [35] left is less than parent`s [8] left value"
  15 => "node [36] left is less than parent`s [8] left value"

данные таблицы

2 ответа

Решение

Я обнаружил проблему, когда я удаляю $em->remove метод, расширение доктрины предполагают, что onDelete=cascade для сущности и изменения lft & rgt Значения дерева, затем выполните запрос для удаления сущности (и всех дочерних элементов), но моя сущность имеет onDelete=restrict, затем lft & rgt значения обновляются, но потомки не удаляются, и это вызывает ошибку в дереве

Я столкнулся с точно такой же проблемой. Возможно, этот ответ поможет кому-то другому.

Gedmo / Tree с вложенным набором выполняет изменения в конечных узлах до начала транзакции удаления. Таким образом, даже если транзакция откатывается, обновленные изменения сохраняются. Чтобы решить эту проблему, вам следует начать транзакцию вручную.

Ref. https://github.com/doctrine-extensions/DoctrineExtensions/issues/1062 и https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/doc/transaction-safety.md

Другие вопросы по тегам