入れ子集合モデルを使用して、mySqlデータベースに階層データ(カテゴリ)を保存しています。
すべてが完全に機能しているだけです。ノード(force_to_top
)にプロパティを追加して、ノードを一時的に兄弟の先頭に強制するように設定する機能が必要です。物理的に変更せずにこれを行う方法が100%わかりません。lft
とrgt
値。
ノードプロパティがオンになっている場合、元の値と値を他の場所force_to_top
に保存したくないので、値を変更してノードを正しい位置に移動し、プロパティが削除されたら元の値と値をリセットします。それはさらに大きな問題を引き起こすだろうと思います、そしてそれは物事を行うための非常に回りくどい方法のように思えますか?(それが実際に最も簡単な方法である場合は訂正してください!しかし、別の方法を見つけたいと思います。できれば、データベース内の値を更新せずにSQLのみを使用してください)lft
rgt
lft
rgt
lft
rgt
force_to_top
force_to_top
プロパティに応じてSQLの出力をなんとか操作できるのではないかと思っていました。
たとえば、次の構造がある場合
Cars
|
-----------------
| | |
Audi Ford VW
次のlft/rgt/force_to_top値があります。
node lft rgt force_to_top
Cars 1 8 false
Audi 2 3 false
Ford 4 5 false
VW 6 7 false
'Cars'の子ノードを出力すると、次のようになります。
Audi
Ford
VW
しかし、ノード「VW」のforce_to_top
プロパティがに設定されてtrue
いるとしましょう。私が本当に必要とするのは、「Cars」の子ノードの出力です。
VW
Audi
Ford
前述したように、元lft
の値と値を保存し、プロパティが削除されrgt
た後にそれらをリセットすることを考えました。force_to_top
この方法を行わないことのプラス面は、プロパティをオフにする速度です。これは、実際に値を再度force_to_top
設定する以外にデータ操作がないことを意味し、ノードはすぐに元の位置に戻ります。また、各ノードの元の値と値に対して、ストレージ領域/追加のテーブル/追加のフィールドを作成する必要がないことも意味します。force_to_top
false
lft
rgt
結果を取得した後、phpでこれを行うことも考えましたが、データセットが大きい場合は、処理速度が大幅に低下する可能性があります。
もともとはforce_to_top
ノードをすべての最上位に設定する必要がありましたが、これは非常に簡単でしたがORDER BY force_to_top, lft
、ノードが大規模な階層の中心にある可能性があるため、兄弟の最上位に強制するだけではるかに複雑になりました。
任意の提案や正しい方向へのポイントをいただければ幸いです。