سؤال

أواجه مشكلة عند محاولة الانتقال دون العقد أو الأم العقد لأعلى أو لأسفل...لست جيدا في الرياضيات.

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

NOT NULL AUTO_INCREMENT, page-left mediumint(8) unsigned NOT NULL,
page-right عدد صحيح(8) غير موقعة لا لاغية ، page-title text NOT NULL,
page-content text NOT NULL,
page-time int(11) unsigned NOT NULL, page-slug text NOT NULL,
page-template text NOT NULL,
page-parent mediumint(8) غير موقعة لا فارغة ، page-type text NOT NULL, المفتاح الأساسي (page-id) ) ENGINE=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, 'الأم', ", 0, "), (18, 2, 5, '2', ", 0, 'SUB', ", 17, "), (19, 3, 4, '3', ", 0, 'SUB-SUB', ", 18, "), (20, 7, 8, '5', ", 0, 'اختبار', ", 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 يجب أن تحتوي على مجموعة من معرف ، فهرستها من قبل الوالدين id, يمكن إنشاء هذا (استنادا إلى الجدول الخاص بك هيكل) على النحو التالي ($db يجب أن تحتوي نشط شركة تنمية نفط عمان كائن الاتصال):

    $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-structure

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top