문제

하위 노드 나 부모 노드를 위 또는 아래로 이동하는 데 어려움을 겪고 있습니다. 수학에 적합하지 않습니다.

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

null auto_increment, page-leftmediumint (8) 서명되지 않은 null,
page-right smallint (8) 서명되지 않은 null, page-title 텍스트는 null,
page-content 텍스트는 null,
page-time int (11) 서명되지 않은 null, page-slug 텍스트는 null,
page-template 텍스트는 null,
page-parent mediumint (8) 서명되지 않은 null, page-type 텍스트가 아닌 텍스트, 기본 키 (page-id)) 엔진 = Myisam 기본 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,'부모 ',' ', 0,' '), (18, 2, 5,'2 ',' ', 0,'sub ' , '', 17, ''), (19, 3, 4, '3', '' ', 0,'sub-sub ',', 18, ''), (20, 7, 8, '5 ',' ', 0,'test ',' ', 0,' ');

예를 들어 Page-Left/Page-Right IDS를 사용하여 Sub-Sub 아래에서 하위 아래로 이동하는 방법을 예를 들어 어떻게해야합니까? 코드는 필요하지 않습니다. 단지 SQL 개념이나 수학에 대한 도움이 필요합니다. 더 잘 움직이는 방법을 이해하는 데 도움이 될 것입니다 ...

도움이 되었습니까?

해결책

기본적으로 인접력 목록을 중첩 세트로 변환하고 싶습니까? 먼저 인접력 목록을 업데이트 한 다음 (예 : 새 트리의 올바른 값으로 Page_Parent 값을 업데이트) 아래 변환을 실행하십시오.

PHP 사용 (기본 코드, Untested) :

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는 부모 -ID에 의해 색인 된 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);

따라서 기본적으로 노드 당 올바른 왼쪽 및 오른쪽 값을 결정하기 위해 재귀적인 방식으로 통과 할 트리의 모든 노드를 포함하는 배열을 만듭니다.

btw 당신은 일반 SQL로 할 수 있습니다 (테이블/열 이름을 조정 한 후) :http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top