2012-07-24 4 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

+0

사용자를 위해 메뉴가 생성되어야합니다. 각 메뉴는 모듈을 포함하지만 동시에 사용자 역할과 역할 메뉴에 속한 모듈 만 포함합니다. 감사합니다. – dzeno

+0

ORM 조인으로 바꿀 "foreach 루프"를 표시하십시오. – biakaveron

답변

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); 
관련 문제