2013-04-26 45 views
0

我有一個從數據庫加載菜單的項目。架構是第一我有頂級橫向菜單(管理員,設置,報告)模塊,然後子模塊左側垂直菜單標題(用戶,書籍)和最後一個是節點,當點擊子菜單(用戶管理,密碼重置,圖書大師,圖書清單)。在laravel中使用五個模型的雄辯映射表關係4

 Admin > Users > User Management 
     Admin > Books > Book Master 
     Settings > Users > Password Reset 
     Reports > Books > Book Lists 

像這樣,節點只會來一次,模塊和子模塊會重複。

有五個表:menu_modules,menu_sub_modules,module_submodule_mapping,menu_nodes和submodule_node_mapping。

'menu_module領域' - menu_module_id,MODULE_NAME,created_at,的updated_at

'menu_sub_modules' 字段 - menu_sub_module_id,sub_module_name,created_at,的updated_at

'module_submodule_mapping' 字段 - sub_module_mapping_id,menu_module_id,menu_sub_module_id,created_at,的updated_at

'menu_nodes' 字段 - menu_node_id,節點名稱,created_at,的updated_at

'submodule_node_mapping' - node_mapping_id ,menu_sub_module_id,menu_node_id,created_at,的updated_at

首先我得使用雄辯的關係,這樣的查詢結果中laravel 4:

SELECT A.module_name,B.sub_module_name FROM menu_module A,menu_sub_modules B,module_submodule_mapping C WHERE A.menu_module_id = C.menu_module_id AND B.menu_sub_module_id = C.menu_sub_module_id 

然後第二次的結果是這樣的查詢:

SELECT A.node_name FROM menu_nodes A,submodule_node_mapping B WHERE A.menu_node_id = B.menu_node_id AND C.menu_sub_module_id = '1' 

任何人都可以解釋模型結構和方法,以及如何獲得結果。請注意,我正在使用自己的id字段,如menu_node_id,並且該項目位於laravel 4.

回答

1

我相信您正在尋找的操作,使用查詢生成器的時間會更少,因爲它具有方法在表上執行連接。這將需要對錶格結構進行一些重建,但最終應該更易於理解。

menu_modules

  1. ID
  2. created_at
  3. 的updated_at

menu_sub_modules

  1. 編號
  2. menu_id(這將是一個外鍵menu_modules)
  3. created_at
  4. 的updated_at

menu_nodes

  1. ID
  2. sub_id (這將成爲男性的外鍵u_sub_modules)
  3. created_at
  4. 的updated_at
這些外鍵

已經到位,我們可以使用查詢構建器,而不必擔心額外的數據透視表。

DB::table('menu_modules') 
->JOIN('menu_sub_modules', 'menu_sub_modules.menu_id', '=', 'menu_modules.id') 
->JOIN('menu_nodes', 'menu_nodes.sub_id', '=', 'menu_sub_modules.id') 
->get(); 
+0

謝謝。它的工作 – devo 2013-04-29 03:11:14