2012-09-23 63 views
0

我有我希望有人可以幫助我的問題。我認爲這段代碼是正確的,但它不起作用。下面是我的代碼,它是我的CakePHP 2.2.2站點的一個函數,代碼的主要目的是從數據庫結果產生一個菜單系統。問題是我的foreach循環,它不會循環。所有$ Key都會返回2的值(此時表中有三條記錄)。所以當我顯示/ echo/debug $ Menu時,我得到的唯一結果是存儲在數據庫中的最後一個結果。CakePHP的Foreach邏輯問題

我知道SQL命令是正確的,如果這是debuged /回顯,然後顯示所有三個結果。這個循環的想法是讓它計算結果,以便我可以對選定的字段進行檢查。我哪裏出錯了?

function MenuSystem() { 
$this->loadModel('Menu'); 

$MenuSQL = $this->Menu->find('all', array('conditions' => array('active' => true))); 

foreach ($MenuSQL as $Key=>$Value) { 

    $MenuSystem = $MenuSQL[$Key]; 
    $this->Menu = $MenuSystem; 

} 

} 

非常感謝, 格倫。

UPDATE :::

下面是我的職責,我現在的foreach循環現在工作了,不知道我在做什麼錯的,但我想知道它的工作。您可以看到我用於測試的print_r命令,如果使用該命令,那麼來自我的數據庫的所有鏈接都將在屏幕上顯示/回顯並顯示所有作品。但是如果我嘗試從另一個控制器調用$ this-> Menu,則只有最後一條記錄在屏幕上回顯。我在foreach循環之外移動了$ this-> Menu,但它在循環內部或外部沒有任何區別,它仍然只響應最後一個記錄,而不是全部三個。那麼我做錯了什麼?

function MenuSystem() { 
    $this->loadModel('Menu'); 
    $SiteBase = '/projects/cake/'; 
    $MenuSQL = $this->Menu->find('all', array('conditions' => array('active' => true))); 

foreach ($MenuSQL as $key => $Value) { 

    $MenuAccessLevel = $MenuSQL[$key]['Menu']['roles_id']; 

    if ($MenuAccessLevel == 1) { 
     $Path = $MenuSQL[$key]['Menu']['path']; 
     $Title = $MenuSQL[$key]['Menu']['title']; 
     $MenuSys = "<a href=\" " . $SiteBase . $Path . " \">" . $Title .""; 
    } else { 
     print ("Admin"); 
    } 
    //print_r($MenuSys); 
} //End of Foreach Loop 
    $this->Menu = $MenuSys; 
} //End of function MenuSystem 

回答

3

所以,當我顯示/回聲/調試$菜單,唯一的結果我得到的是存儲在數據庫中的最後一個結果。

您正在將foreach中的值設置爲$this->Menu,所以當foreach完成時,將會使用迭代的最後一個值。

如果你想找到的匹配條件的記錄數,請嘗試:

$menuCount = $this->Menu->find('count', array(
    'conditions'=>array('active'=>true) 
)); 
$this->set(compact('menuCount')); 

編輯:此外,通過在foreach內設置的$this->Menu值,你覆蓋菜單模型變量。這不是一個好主意。

EDIT2:讓行的計數一些價值分組,嘗試:

$this->Menu->virtualFields = array('count' => 'count(*)'); 
$counts = $this->Menu->find('all', array(
    'group'=>'Role', 
    'fields'=>array('Role', 'count'), 
)); 

這會生成SQL有由Role列分組的結果。返回的字段是角色的名稱,以及具有該值的行數。

如果你想有一個foreach循環來做到這一點,相反,它可能看起來像:

$menus = $this->Menu->find('all', array('fields'=>array('id', 'Role'))); 
$counts = array('user'=>0, 'admin'=>0); 
foreach ($menus as $menu) { 
    $role = $menu['Menu']['Role']; 
    $counts[$role] += 1; 
} 
+0

+1還糾正語法和使用適當的(CakePHP的)編碼stadards :) – mark

+0

對不起,我不認爲這會爲我想要做的事情工作,伯爵只是給你一個總量的權利? (我檢查它,玩它來看我自己)。我最終的目標是檢查菜單表中的字段,稱爲角色,它將設置爲用戶或管理員。因此,我不需要總數,我需要循環查看此表中的每個記錄。 –

+0

我已更新我的答案 –