嗨,我正在将 CodeIgniter 与 DataMapper 一起使用,并且确实需要一些帮助来定义模型类(DataMapper 模型类)中的关系
我将如何为此编写模型关系。对 Self 关系有点困惑,即菜单项和子菜单
菜单有许多子菜单,子菜单可以有一个或多个子子菜单
类别:导航 表:导航 [id] [parent_id] [名称] ..
谢谢
嗨,我正在将 CodeIgniter 与 DataMapper 一起使用,并且确实需要一些帮助来定义模型类(DataMapper 模型类)中的关系
我将如何为此编写模型关系。对 Self 关系有点困惑,即菜单项和子菜单
菜单有许多子菜单,子菜单可以有一个或多个子子菜单
类别:导航 表:导航 [id] [parent_id] [名称] ..
谢谢
这是一对多的关系(一个项目有一个父项,一个父项可以有许多项)。
所以你的模型看起来像:
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,在树中的特定位置插入新记录等)。