2012-07-24 7 views
5

Kohana 3.2 'avance' ORM se une

Ésta es ERD base de datos que utilizo en su aplicación. Estoy usando Kohana 3.2. Lo que quiero lograr es generar un menú para el usuario actualmente registrado. Cada usuario puede tener muchos roles, por lo que, en función de ese usuario, se debe llenar el menú con módulos (que están relacionados con el menú y el usuario).

Lo he logrado a través de varios bucles foreach. ¿Es posible hacer esto usando ORM?

* Tabla 'Módulos' representa los elementos del menú.

Editar: este es mi código actual.

 $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

No hay suficiente información. ¿Qué tipo de uniones quieres? – biakaveron

+0

El/los menú/s se deben generar para el usuario. Cada menú contiene módulos (pero solo los que pertenecen al rol de usuario y al menú de funciones al mismo tiempo) .Gracias – dzeno

+0

Muestre sus "bucles foreach" que desea reemplazar con ORM join – biakaveron

Respuesta

0

Creo que esta debería ser una buena solución.

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