我有问题,希望有人可以帮助我。我认为这段代码是正确的,但它不起作用。下面是我的代码,它是我的CakePHP 2.2.2站点的一个函数,代码的主要目的是从数据库结果生成一个菜单系统。问题在于我的foreach循环,它不会循环。所有$ Key都返回值2(此时表中有三条记录)。所以当我显示/ echo / debug $ Menu时,我得到的唯一结果是存储在数据库中的最后结果。
我知道SQL命令是正确的,如果是debuged / echoed则显示所有三个结果。这个循环的想法是让它计算结果,以便我可以对选定的字段进行检查。我哪里错了?
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;
}
}
非常感谢, 格伦。
更新:::
下面是我的功能,现在我的foreach循环现在有效,不知道我做错了什么,但我知道它的工作原理。您可以看到我用于测试的print_r命令,如果我使用它,那么我的数据库中的所有链接都会在屏幕上打印/回显,并且一切正常。但是,如果我尝试从另一个控制器调用$ this->菜单,则只会在屏幕上回显最后一条记录。我已将$ this->菜单移到foreach循环之外,但它没有任何区别,它在循环内部或外部,它仍然只回显最后一条记录而不是全部三条记录。那么我做错了什么?
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
答案 0 :(得分:3)
所以当我显示/ echo / debug $ Menu时,我得到的唯一结果是存储在数据库中的最后结果。
您在foreach中设置了$this->Menu
的值,因此当foreach完成时,它会迭代最后一个值。
如果要查找与条件匹配的记录数,请尝试:
$menuCount = $this->Menu->find('count', array(
'conditions'=>array('active'=>true)
));
$this->set(compact('menuCount'));
编辑:另外,通过在foreach中设置$this->Menu
的值,您将覆盖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;
}