Вопрос

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

CREATE TABLE IF NOT EXISTS `pages` (   `page-id` mediumint(8) unsigned

Не null auto_increment, page-leftMediumInt (8) без знака не нулевой,
page-right Smallint (8) без знака не нулевой, page-title текст не нулевой,
page-content текст не нулевой,
page-time int (11) без подписи не нулевой, page-slug текст не нулевой,
page-template текст не нулевой,
page-parent MediumInt (8) без знака не нулевой, page-type текст не нулевой, первичный ключ (page-id)) Двигатель = myisam default charset = latin1;

Вставить в pages (page-id, page-left, page-right, page-title, page-content, page-time, page-slug, page-template, page-parent, page-type) Значения (17, 1, 6, '1', '', 0, 'parent', '', 0, ''), (18, 2, 5, '2', '', 0, 'sub' , '', 17, ''), (19, 3, 4, '3', '', 0, 'sub-sub', '', 18, ''), (20, 7, 8, '5 ',' ', 0,' test ',' ', 0,' '');

В качестве примера, как я бы перенесли тест над родителем и скажем, переместите подразделение вниз внизу, играя с идентификаторами с правом страницы/правом страницы? Код не требуется только помогать с концепцией SQL или математикой для него, поможет мне понять, как его перемещать лучше ...

Это было полезно?

Решение

Итак, в основном вы хотите преобразовать список смежности в вложенный набор? Сначала обновите свой список смежности (т.е. обновите значения page_parent до правильных значений для вашего нового дерева), затем запустите преобразование ниже.

Использование PHP (базовый код, непроверенный):

class Tree
{    
    private $count = 0;
    private $data = array();

    /**
     * Rebuild nested set
     * 
     * @param $rawData array Raw tree data
     */
    public function rebuild($rawData)
    {
        $this->data = $rawData;
        $this->count = 1;
        $this->traverse(0);        
    }

    private function traverse($id)
    {
        $lft = $this->count;
        $this->count++;

        if (isset($this->data[$id])) {
            $kid = $this->data[$id];
            if ($kid) {
                foreach ($kid as $c) {
                    $this->traverse($c);
                }
            }
        }

        $rgt = $this->count;
        $this->count++;

        // TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
        ...
    }
}

Когда вы называете это, $ rawdata должен содержать массив идентификаторов, индексированных от Parent-ID, вы можете создать его (в зависимости от структуры вашей таблицы) следующим образом ($ DB должен содержать активный объект соединения PDO):

    $sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';

    $stmt = $db->prepare($sql);
    $rawData = array();
    $stmt->execute();
    while ($row = $stmt->fetch()) {
        $parent = $row['page_parent'];
        $child = $row['page_id'];
        if (!array_key_exists($parent, $rawData)) {
            $rawData[$parent] = array();
        }
        $rawData[$parent][] = $child;
    }

Чтобы сделать обращение, вам понадобится что -то вроде:

$tree = new Tree();
$tree->rebuild($rawData);

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

Кстати, вы можете сделать это в простом SQL (после адаптации имен таблицы/столбцов):http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id Структуру

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top