FuelPHPをやってみる (30) - Model_Nestedset -

2013-11-07T00:00:00+00:00 FuelPHP PHP

久々に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

Annotation Processorの基本的な所 InputMethodServiceを使ってIMを作るメモ