次のテーブル構造がありますが、これも便宜上sqlfiddleにあります。
+---------+-----------+---------+----------+------ ---+---------------------------------+------------------------ -----------+--------+--------------+-------------+ ---------------+-----------+ | | ルール ID | 親 ID | left_id | right_id | ルールの種類 | ルールタイトル | ルールの説明 | 公開 | parse_bbcode | parse_links | parse_smilies | グループ ID | +---------+-----------+---------+----------+------ ---+---------------------------------+------------------------ -----------+--------+--------------+-------------+ ---------------+-----------+ | | 1 | 0 | 1 | 6 | 猫 | 猫 | サンプル カテゴリ 1 | | | 1 | 0 | 0 | 0 | 1 2 7 | | | 2 | 1 | 2 | 3 | ルール | サンプル ルール 1 | これはルールの説明のサンプルです | 1 | 1 | 1 | 1 | 1 2 7 | | | 3 | 0 | 7 | 8 | 猫 | 猫 | サンプル カテゴリ 2 | | | 1 | 0 | 0 | 0 | 1 7 2 | | | 4 | 0 | 9 | 10 | 猫 | 猫 | サンプル カテゴリ 3 | | | 1 | 0 | 0 | 0 | 1 7 2 | | | 5 | 1 | 4 | 5 | ルール | サンプル ルール 3 | 笑 | 1 | 1 | 1 | 1 | 1 2 7 | +---------+-----------+---------+----------+------ ---+---------------------------------+------------------------ -----------+--------+--------------+-------------+ ---------------+-----------+
ご覧のとおり、 または のrule_typeいずれ'cat'かになります'rule'。
catはカテゴリを表し、カテゴリはルートノードです。parent_id常にそう0です。私のコードでは、 ifrule_type = 'cat'またはをチェックすることでカテゴリを識別できますparent_id = 0。
また、プロジェクトにネストされたセットを使用していることもわかりますが、これが問題の原因です。
次の機能を正常に作成しました。
ルールとカテゴリを上下に移動します。と
それぞれの場所の最後に新しいルールまたはカテゴリを配置します。
しかし、ルールの 設定に失敗していますright_id&left_idそのを変更した場合parent_id! ルールまたはカテゴリを削除すると、right_id&の設定にも失敗します。left_id
例
例を挙げて説明しようと思います。これは単なる例であり、実際のケースではないことに注意してください。一般的な回答が必要です。
rule_id IN (1, 3, 4)上の表から、 の 3 つのカテゴリと の 2 つのルールがあることがわかりますrule_id IN (2, 5)。
のルールはrule_id = 2のカテゴリの一部です。列rule_id = 1から確認できます。parent_idを 4に変更するとどうparent_idなりますか? right_id&はどのようleft_idに設定されるので、すべてが再び適切に配置されますか? すべてを並べ替えるには両方を更新する必要があるrule_id IN (1, 4)ことはわかっていますが、クエリがどのようになるかわかりません。
削除についても同じことが言えます...たとえば、削除しますrule_id = 2(これはルールです)、正しい順序でright_id&left_idを設定するにはどうすればよいですか? parent_id = 1または、カテゴリを削除するときは?カテゴリを並べ替えるにはどうすればよいですか?
どうやってそのようなことをするかについてのビジョンがないので、私はここで何もしようとはしませんでした。
私は自分自身を明確にしたことを願っています。そうでない場合はお知らせください。さらに詳しく説明します。