これは 1 対多の関係です (アイテムには 1 つの親があり、親は複数のアイテムを持つことができます)。
したがって、モデルは次のようになります。
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 フォーラムで既に回答したように) これはあまり最適なソリューションではないことに注意してください。ツリーは複数のレベルの入れ子になる可能性があるためです。この設定では、一度に 1 つのレベルしか取得できないため、反復する必要があることを意味します。ひとり親の場合。これは、あらゆるサイズの木にとって悪夢になります。
テーブル内にネストされたセット ツリーを構築できるようにする、nestedsets 拡張機能を確認し、これらのセットを操作するためのメソッドを Datamapper に追加します (親、子、兄弟の操作、ツリー内の特定の場所への新しいレコードの挿入など)。 )。