0

我有我的问题,我希望有人可以帮助我。我认为这段代码是正确的,但它不起作用。下面是我的代码,它是我的 CakePHP 2.2.2 站点的一个函数,代码的主要目的是从数据库结果中生成一个菜单系统。问题在于我的 foreach 循环,它不会循环。$Key 所做的只是返回值 2(此时表中的三个记录)。所以当我显示/echo/debug $Menu 时,我得到的唯一结果是存储在数据库中的最后一个结果。

我知道 SQL 命令是正确的,如果已调试/回显,则显示所有三个结果。这个循环的想法是让它计算结果,这样我就可以对选定的字段进行检查。我哪里错了?

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->Menu,那么只有最后一条记录会在屏幕上回显。我已经将 $this->Menu 移到了 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
4

1 回答 1

3

所以当我显示/echo/debug $Menu 时,我得到的唯一结果是存储在数据库中的最后一个结果。

您在$this->Menuforeach 中设置 的值,因此当 foreach 完成时,它将采用最后一个迭代的值。

如果要查找匹配条件的记录数,请尝试:

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

编辑:另外,通过设置$this->Menuforeach 中的值,您将覆盖 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;
}
于 2012-09-23T22:42:53.613 回答