2012-07-24 14 views
5

Kohana 3.2 advance ORM verbindet

Dies ist Datenbank ERD, die ich in der Anwendung verwenden. Ich benutze Kohana 3.2. Was ich erreichen möchte, ist ein Menü für den aktuell angemeldeten Benutzer zu erstellen. Jeder Benutzer kann viele Rollen haben, daher sollte der Benutzer ein Menü erhalten, das mit Modulen gefüllt ist (die in Beziehung zu Menü und Benutzer stehen).

Ich habe dies durch mehrere foreach Schleifen erreichen. Ist es möglich, dies mit ORM zu tun?

* Tabelle 'Module' steht für Menüpunkte.

Edit: das ist mein aktueller Code.

 $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

Nicht genügend Informationen. Welche Art von Joins willst du? – biakaveron

+0

Menü/s sollte für Benutzer generiert werden. Jedes Menü enthält Module (aber nur solche, die gleichzeitig zur Benutzerrolle und zum Rollenmenü gehören) .Thanks – dzeno

+0

Bitte zeigen Sie Ihre "foreach Schleifen", die Sie mit ORM Joins ersetzen möchten – biakaveron

Antwort

0

Ich denke, das sollte eine gute Lösung sein.

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