FuelPHPをやってみる (30) - Model_Nestedset -
久々にFuelPHPやってみる。ていうかFuelPHP1.7が出た模様で、OrmパッケージにModel_Nestedsetっていうのがあるらしいので使ってみた
※暫定的なので追記する可能性あり
設定
Ormパッケージに含まれるのでalways_loadなpackages辺りにormな設定が必要。あと無論データーベースな設定も別途でやっておく。まぁ言う必要ないと思うけど...
fuel/app/classes/model/tree.php
ドキュメントに書いてるそのままだけど
<?php
class Model_Tree extends Orm\Model_Nestedset {
protected static $_table_name = "tree";
protected static $_properties = array(
"id",
"left_id",
"right_id",
"tree_id",
"name"
);
protected static $_tree = array(
"left_field" => "left_id", // defaults to "left_id"
"right_field" => "right_id", // defaults to "right_id".
"tree_field" => "tree_id", // There is no default value
"title_field" => "name" // There is no default value
);
}
な感じで定義
使ってみる
$bill = Model_Tree::forge(array("name" => "Bill"));
$bill->save();
$angela = Model_Tree::forge(array("name" => "Angela"));
$angela->child($bill)->save();
$john = Model_Tree::forge(array("name" => "John"));
$john->child($angela)->save();
な感じでデータ突っ込んで取ったりする場合には
// Debug::dump(Model_Tree::forge()->roots()->get());
$bill = Model_Tree::find_by_id(1);
$nodes = $bill->descendants()->get();
foreach ($nodes as $node) {
echo "Name: ". $node->name;
// そこのノードからの祖先なノードを取得?
$ancestors = $node->ancestors()->get();
foreach ($ancestors as $ancestor) {
echo "Ancestor: " . $ancestor->name;
}
}
ってな感じでやると
てな感じになる。という事でツリー構造?っていうようなデータ構造要件があるような場合とか、もしくは再帰処理をしてツリー構造的なのを利用する場合等に使えるんじゃないかとか。活用所が正しいかは微妙ですけど
とりあえずそんなんAPIが追加されてるっていう訳で(ry
公式ドキュメント: http://fuelphp.com/docs/packages/orm/model/nestedset.html