2012-07-24 68 views
5

Kohana 3.2'advance'ORM加入

這是我在應用程序中使用的數據庫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); 
      } 

     } 
+0

沒有足夠的信息。你想要什麼樣的連接? – biakaveron 2012-07-25 05:09:47

+0

應該爲用戶生成菜單/ s。每個菜單都包含模塊(但只包含同時屬於用戶角色和角色菜單的模塊)。感謝 – dzeno 2012-07-25 09:07:43

+0

請使用ORM連接顯示要替換的「foreach循環」 – biakaveron 2012-07-25 09:58:29

回答

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);