1

CakePHPでツリーの動作の問題を開始する際に問題が発生しました。lft、、rghtおよびparent_id列を使用してテーブルを設定しました。

他の人が列で参照できる最初のエントリを追加していparent_idます。しかし、参照は私が望むようには機能しません。

最初のエントリは、期待どおりにデータベースに追加されます。指定しない場合、parent_idその列はNULLデータベース値として取得されます。lftandrght列も値として取得されNULLています。それが何をするのかわかりません。

最初のエントリの後に新しいエントリを追加しようとすると、保存が失敗します。

と列を最初のエントリlftとに設定しようとしましたが、うまくいきませんでした。rght1, 11, 2

私はここで何か間違ったことをしていますか?

4

2 に答える 2

1

あなたは間違いなくlftとrghtを設定したくありません。それらはフレームワークによって処理されます。nullドキュメントで指定されているように、デフォルトでそれらを使用していますか?

ツリービヘイビアを使用する場合は常に設定してparent_idおり、CakePHPは親IDに基づいてツリー構造を自動的に処理します。ブランチ内でアイテムを移動する必要がある場合は、ビヘイビアーの他の機能を使用して移動できます。

だけを設定してparent_id保存してみてください。それがうまくいかない場合は教えてください。

于 2012-07-04T20:59:59.243 に答える
0

興味深いですが、これはCakephpの文書化されていない部分です。ドキュメントには次のように書かれています。parent_idを「null」に設定するために必要なツリーの最上位要素。ただし、編集時に要素を保存すると、子を探して並べ替えるときに興味深い条件があるため、並べ替えは機能しません。

    if ($id === null && $Model->id) {
        $id = $Model->id;
    } elseif (!$id) {
        $id = null;
    }

TreeBehaviorライン300の周り。

したがって、id => nullでreorderを呼び出し、$ Model-> idがある場合、実際のツリーアイテムのみが並べ替えられます。間違っています。最上位のカテゴリアイテムの注文フィールドを変更したため、ツリー全体を並べ替えたいと思います。一種のバグだと思います。

id =>''を空に設定する必要があります。そうしないと、ツリー全体が並べ替えられます。それはあなたが望むです。トップツリーアイテムを編集して並べ替える場合は、id=>''で並べ替えを呼び出す必要があります。

        if(!empty($this->data['WebshopCategory']['parent_id'])){
            $this->reorder ( array('id' => $this->data['WebshopCategory']['parent_id'], 'field' => 'ordered', 'order' => 'ASC', 'verify' => true) );
        }else{
            $this->reorder ( array('id'=>'', 'field' => 'ordered', 'order' => 'ASC', 'verify' => true) );
        }

ツリー全体が並べ替えられます。注:ツリーアイテムが多いと保存が遅くなるため、注文フィールドが変更されたかどうかを確認する必要があります。

于 2014-12-29T18:11:34.193 に答える