Kohana 3.2'推进'ORM加入

时间:2012-07-24 21:14:46

标签: php orm kohana kohana-3

这是我在应用程序中使用的数据库ERD。我正在使用Kohana 3.2。我想要实现的是为当前登录的用户生成菜单。每个用户都可以拥有多个角色,因此基于该用户应该获得填充模块的菜单(与菜单和用户相关)。

我通过几个foreach循环实现了这一点。是否可以使用ORM执行此操作?

*表'模块'代表菜单项。

编辑:这是我目前的代码。

        $conf_modules = Kohana::$config->load('modules');
        $user_roles = $user->roles->find_all();

        $result     = array();
        $array  = array();

        foreach($user_roles as $user_role)
        {
            $menus   = $user_role->menus->find_all();
            $modules = $user_role->modules->find_all();
        }


        foreach($menus as $menu)
        {
            $m = $menu->modules->find_all();

            $result[]['name'] = $menu->name;

            foreach ($m as $a) 
            {
                foreach ($modules as $module) 
                {
                    if($a->name == $module->name)
                    {
                        foreach ($conf_modules as $key => $value) 
                        {
                            if($module->name == $key)
                            {
                                $array = array(
                                    'module_name' => $module->name,
                                    'text'        => $module->display_desc,
                                    'url'         => $value['url'],
                                );
                            }

                        }

                    }

                }
                array_push($result, $array);
            }

        }

1 个答案:

答案 0 :(得分:0)

我认为这应该是一个很好的解决方案。

        $user = Auth::instance()->get_user();

        $user_roles = $user->roles->find_all();

        $conf_modules = Kohana::$config->load('modules');

        $role_modules = ORM::factory('module')
            ->join('roles_modules')
            ->on('roles_modules.module_id','=','module.id')
            ->where('role_id','IN',$user_roles->as_array(NULL,'id'))
            ->find_all();


        $role_menus = ORM::factory('menu')
            ->join('roles_menus')
            ->on('roles_menus.menu_id','=','menu.id')
            ->where('role_id','IN',$user_roles->as_array(NULL,'id'))
            ->find_all();

        $result = array();

        foreach ($role_menus as $role_menu) 
        {
            $menu_modules = $role_menu->modules->find_all();

            if ( ! isset($result[$role_menu->name]))
                $result[$role_menu->name] = array('name' => $role_menu->name);

            foreach ($menu_modules as $menu_module) 
            {
                foreach ($role_modules as $role_module) 
                {
                    if($menu_module->name == $role_module->name)
                    {
                        foreach ($conf_modules as $key => $value) 
                        {
                            if ($key == $role_module->name)
                            {
                                $result[$role_menu->name]['modules'][]['data'] = array('name' => $role_module->display_desc, 'url' => $value['url']);
                            }

                        }

                    }
                }   
            }   
        }

        return array_values($result);