DataMapper自我关系模型

时间:2012-05-08 12:48:35

标签: codeigniter datamapper relationships

您好我正在使用CodeIgniter和DataMapper,并且确实需要一些帮助来定义模型类中的关系(DataMapper Model Class)

我如何为此编写模型关系。对自我关系略微混淆,即菜单项和子菜单

菜单有很多子菜单,子菜单可以有一个或多个子子菜单

Class: navigation
Table: Navigation
[id] [parent_id] [Name] ..

由于

1 个答案:

答案 0 :(得分: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论坛上回复的那样)这不是一个非常优化的解决方案,因为树可以是多个级别的嵌套,这种设置意味着必须迭代,因为您只能在时间和单亲。这将成为任何大小树的噩梦。

查看nestedsets扩展,它允许您在表中构建嵌套集树,并将方法添加到Datamapper以操作这些集(例如使用父项,子项,syblings,在特定位置插入新记录)树等等。