Закрытие таблицы (перемещение поддеревьев) - PullRequest
0 голосов
/ 30 октября 2018

Привет У меня есть дизайн базы данных

+-------------+--------------+-------+
| referral_id | referrent_id | level |
+-------------+--------------+-------+

В моей базе данных есть строки с данными, подобными этим:

+---+---+---+
| 1 | 1 | 0 |
+---+---+---+
| 1 | 2 | 1 |
+---+---+---+
| 1 | 3 | 1 |
+---+---+---+
| 1 | 4 | 1 |
+---+---+---+
| 2 | 2 | 0 |
+---+---+---+
| 3 | 3 | 0 |
+---+---+---+
| 4 | 4 | 0 |
+---+---+---+

В основном дерево

  / 2
1 - 3
  \ 4

И я пытаюсь переместить 3, чтобы быть под 2

  / 2 - 3
1 - 4

Моя реализация:

public function changeReferrer(Member $newReferrer) {
        $oldReferrer = $this->getReferrer(1); // this retrieves the ancestor one level up
        DB::select('DELETE a FROM Referrer_Referent AS a
                    JOIN Referrer_Referent as d ON a.referent_id = d.referent_id
                    LEFT JOIN Referrer_Referent AS x
                    ON x.referrer_id = d.referrer_id AND x.referent_id = a.referrer_id
                    WHERE d.referrer_id = '.$oldReferrer->id.'
                    AND x.referrer_id IS NULL');

        DB::select('INSERT into Referrer_Referent (referrer_id, referent_id, level)
                    SELECT supertree.referrer_id, subtree.referent_id, supertree.level + subtree.level + 1
                    FROM Referrer_Referent as supertree JOIN Referrer_Referent as subtree
                    WHERE subtree.referrer_id = '.$oldReferrer->id.'
                    AND supertree.referent_id = '.$newReferrer->id);
    }

Так что я бы назвал свою функцию как $user3->changeReferrer($user2); Но я получаю следующие ошибки:

Нарушение ограничения целостности: 1062 Повторяющаяся запись '1-1' для ключа 'PRIMARY' (SQL: INSERT в Referrer_Referent (referrer_id, referent_id, уровень) SELECT supertree.referrer_id, subtree.referent_id, supertree.level + subtree.level + 1 FROM Referrer_Referent в качестве супердерева JOIN Referrer_Referent в качестве поддерева WHERE subtree.referrer_id = 1 И supertree.referent_id = 2)

Прикрепление этого блога в качестве ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...