ツリー(Tree)
木構造のような階層構造を扱うためのビヘイビア。入れ子集合モデルにparent_idを加えた仕組みになっています。(parent_idを加える事でデータは若干冗長になります)
入れ子集合モデルについてはSQLで木と階層構造のデータを扱う(1)―― 入れ子集合モデルで詳しい解説を読む事が出来ます。
Treeビヘイビアを使う準備
Treeビヘイビアを使用するには使用するテーブルに指定のフィールドが存在している必要があります。
- id
- parent_id
- lft
- rght
lftやrghtフィールドはビヘイビアが面倒を見てくれますので意識する必要はほとんどありません。
CREATE TABLE categories ( id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INTEGER(10) DEFAULT NULL, lft INTEGER(10) DEFAULT NULL, rght INTEGER(10) DEFAULT NULL, name VARCHAR(255) DEFAULT '', PRIMARY KEY (id) );
Treeビヘイビアを使う
Treeビヘイビアを使うにはモデル内でビヘイビアを使うよう$actsAs属性に'Tree'をセットします。配列になっているのは複数のビヘイビアを指定出来るためです。
var $actsAs = array('Tree');
ノードの追加/編集/削除
ビヘイビアのメソッドを直接使う必要はありません。モデルのsaveメソッドやdeleteメソッドを使用します。ただしsaveメソッドを使う時はparent_idに親ノードのIDを指定する事を忘れないで下さい。
主なメソッド
- children( $id = NULL, $direct = false, $fields = NULL, $order = NULL, $limit = NULL, $page = 1, $recursive = NULL )
- childCount($id = NULL, $direct = false )
- generatetreelist( $id = NULL, $direct = false, $fields = NULL, $order = NULL, $limit = NULL, $page = 1, $recursive = NULL )
- getparentnode($id,$fields = NULL, $recursive = NULL )
- getpath($id,$fields = NULL, $recursive = NULL )
- reorder($options)
$idの指定がオプションになっているメソッドは、Model->idのノードが操作対象のノードになります。
childCount($id = NULL, $direct = false )
第1引数で指定したノードの子孫ノードの数を取得します。第2引数をtrueにすると直下の子ノードのみの数になります。トップレベルのノードを数えるときは第1引数をfalse(nullではない)にします。トップレベルのノードを扱う時の注意もチェックして下さい。
getpath($id,$fields = NULL, $recursive = NULL )
ルートからのパスを配列で取得します。
reorder($options)
子要素の並び順を変更します。
$options['id']
$options['field'] フィールド名。デフォルトはdisplayFieldで指定したフィールド(nameやtitle)。
$options['order'] ソート順の指定、'DESC' または 'ASC'。デフォルトは'ASC'。
$options['verify'] 整合性チェック。デフォルトは'true'。
その他のメソッド
- recover
- verify
トップレベルのノードを扱う時の注意
children、childCount、reorderなどメソッドでは親ノードを指定できます。トップレベルのノードを扱いたい時は、falseを指定します。NULLを指定するとModel->idが指定された事になります。
$this->Category->childCount(false,true);
パスからノードを特定する
Treeビヘイビアにはパスを使ってノードを特定するためのメソッドがありません。AclNodeクラスのNodeメソッドの実装が参考になります。