CakePHP的Foreach逻辑问题

时间:2012-09-23 22:36:12

标签: cakephp loops foreach

我有问题,希望有人可以帮助我。我认为这段代码是正确的,但它不起作用。下面是我的代码,它是我的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

1 个答案:

答案 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;
}