0

誰かが私を助けてくれることを願っています。このコードは正しいと思いましたが、機能しません。以下は私のコードです。これは私のCakePHP2.2.2サイトの関数です。コードの主な目的は、データベースの結果からメニューシステムを作成することです。問題は私のforeachループにあり、ループしません。$ Keyが行うのは、値2(現時点ではテーブル内の3つのレコード)を返すことだけです。したがって、$ Menuを表示/エコー/デバッグすると、データベース内に保存されている最後の結果のみが得られます。

SQLコマンドが正しいことはわかっています。それがデバッグ/エコーされると、3つの結果すべてが表示されます。このループのアイデアは、選択したフィールドでチェックを実行できるように、結果をカウントするようにすることでした。どこが間違っているのですか?

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ループの外側に移動しましたが、ループの内側または外側で違いはなく、3つすべてではなく、最後のレコードのみをエコーし​​ます。だから私は何を間違っているのですか?

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

したがって、$Menu を表示 / エコー / デバッグすると、得られる唯一の結果は、データベース内に保存された最後の結果です。

foreach 内で値を設定している$this->Menuため、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 に答える