Это взаимно много отношения (у элемента есть один родитель, у родителя может быть много элементов).
Так что ваша модель будет выглядеть следующим образом:
class Menu extends DataMapper {
public $has_one = array(
'parent' => array(
'class' => 'menu',
),
);
public $has_many = array(
'menu' => array(
'class' => 'menu',
'other_field' => 'parent',
),
);
}
Это позволит вам сделать:
// assume your tree root has parent id 0
$root = new Menu();
$root->where('parent_id', 0)->get();
// get the first level menu from the root
$submenu = $root->menu->get();
// get the parent from the first submenu entry (should be root again)
$rootagain = $submenu->parent->get();
Обратите внимание, что (как я уже ответил на форуме CI) это не очень оптимальна решение, поскольку дерево может быть несколькими уровнями вложенности, с этой настройкой это означает, что нужно выполнить итерацию, поскольку вы можете получить только один уровень в то время и для одного родителя. Это станет кошмаром для дерева любого размера.
Ознакомьтесь с расширением nestedsets, которое позволит вам построить дерево вложенных множеств в таблице и добавит методы Datamapper для управления этими наборами (например, работа с родителями, дочерние элементы, syblings, вставка новых записей в определенных местах в дерево и т. д.).