Skip to content
Materialized Path plugin for Kohana ORM
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


class Kohana_ORM_MP extends ORM {
    protected $max_level = 32;

    readonly $children;
    readonly $siblings;
    readonly $descendants;
    readonly $parent_ids;
    readonly $parent_id;

    readonly $roots;
    readonly $root;
    readonly $parent;
    readonly $parents;

    function is_root();
    function has_children();
    function is_leaf();
    function is_descendant (ORM_MP|int $target);
    function is_child      (ORM_MP|int $target);
    function is_parent     (ORM_MP|int $target, $full_path = false);
    function is_sibling    (ORM_MP|int $target);

    function load_tree(int $id = null);
    function save(Validation $validation);
    function insert (ORM_MP $target = null, Validation $validation);
    function move   (ORM_MP $target = null);
    function set_position(int $position = null);

    function delete_branch();
    function get_child($id);

    // Details :

    /** is_parent :
     * if full_path is sets to true - will check all parents
     * else - only closest. it is equals to :
     * $target->is_child($this)      if $full_path == false
     * $target->is_descendant($this) if $full_path == true
    /** load_tree:
     * call this if you want to work with descendants
    /** save:
     * saves element as root
    /** insert:
     * saves element as root, or as child of $target
    /** get_child:
     * returns the child with some id, or null



All root elements:



$cat_15 = ORM::factory('Category', 15)->load_tree(  );
$cat_15 = ORM::factory('Category'    )->load_tree(15);

Root of element:



$cat_15->move(ORM::factory('Category', 21));



Create root:


Create leaf:

    ->insert( ORM::factory('Category', 40) );

You can use ID as target instead of object:


Outputs :

function r_render(Model_Category $category) {
    $result = "";
    foreach ($category->children as $child) {
        $sub_list = r_render($child);
        $result  .= "<li><b>{child->title}</b> {$sub_list}</li>";
    return "<ul>{$result}</ul>";
echo r_render($category);


when depth reach $max_level all elements will be added to parent of such deep element.
E.g., when $max_level equals 32
"Foo" is closest parent to "Bar" and "Foo" has 31 parents;
If we try to add "Lua" to "Bar", it will be added to "Foo"
because $max_level reached. but it is rare situation
Something went wrong with that request. Please try again.