2016-10-31 19 views
0

我已經使用了CakePHP 2.0很長一段時間了,我正試圖遷移到3.0。大部分情況都很好,但是我非常困惑於如何從表格中檢索數據並將其顯示在視圖中。如何在CakePHP 3.0中顯示檢索到的數據?

假設我的數據庫包含菜單和菜單項。每個菜單可以有多個菜單項(每個菜單項記錄都有菜單項ID)。

所以,CakePHP的2.0我將不得不如下:

Model: 
Menu hasMany Menuitem 

Controller: 
$this->set->recursive = 1; 
$menu = $this->Menu->findById($menuid); 

View: 
foreach($menu['Menuitem'] as $item) { 
... display item ... 
} 

餅3.0我試圖複製此。所以,我有:

In Model/Table/MenusTable.php: 
    public function initialize(array $config) 
    { 
     $this->hasMany('Menuitems', [ 
         'sort' => ['Menuitems.order' => 'ASC'] 
     ]); 
    } 

In Controller: 
$menus= TableRegistry::get('Menus'); 
$query = $menus->find('all') 
        ->contain(['Menuitems'); 
$menulist= $query->toArray(); 
$this->set(compact('menulist')); 

我現在該如何在視圖中顯示?

如果我嘗試:

foreach($menu['Menuitem'] as $item) 

然後我得到的錯誤 「未定義指數:菜單項」。

然後我嘗試了$ menu.menuitems和$ menu-> menuitems,但那些都不起作用。我哪裏錯了?謝謝!

編輯:對不起消失了幾天。如果我做調試($ menulist);我得到如下:

(int) 0 => object(Cake\ORM\Entity) { 
    'id' => (int) 1, 
    'name' => 'Main', 
    'menuitems' => [ 
     (int) 0 => object(Cake\ORM\Entity) { 

      'id' => (int) 1, 
      'subsite_id' => (int) 1, 
      'page_id' => (int) 1, 
      'parentmenuitem_id' => null, 
      'nav_order' => (int) 1, 
      'nav_width' => null, 
      'children' => [], 
      '[new]' => false, 
      '[accessible]' => [ 
       '*' => true 
      ], 
      '[dirty]' => [], 
      '[original]' => [], 
      '[virtual]' => [], 
      '[errors]' => [], 
      '[invalid]' => [], 
      '[repository]' => 'Menuitems' 

     }, 
     (int) 1 => object(Cake\ORM\Entity) { 

      'id' => (int) 2, 
      'subsite_id' => (int) 1, 
      'page_id' => (int) 2, 
      'parentmenuitem_id' => null, 
      'nav_order' => (int) 2, 
      'nav_width' => null, 
      'children' => [ 
       (int) 0 => object(Cake\ORM\Entity) { 

        'id' => (int) 9, 
        'subsite_id' => (int) 1, 
        'page_id' => (int) 9, 
        'parentmenuitem_id' => (int) 2, 
        'nav_order' => (int) 1, 
        'nav_width' => null, 
        '[new]' => false, 
        '[accessible]' => [ 
         '*' => true 
        ], 
        '[dirty]' => [], 
        '[original]' => [], 
        '[virtual]' => [], 
        '[errors]' => [], 
        '[invalid]' => [], 
        '[repository]' => 'Children' 

       }, 
       (int) 1 => object(Cake\ORM\Entity) { 

        'id' => (int) 10, 
        'subsite_id' => (int) 1, 
        'page_id' => (int) 13, 
        'parentmenuitem_id' => (int) 2, 
        'nav_order' => (int) 2, 
        'nav_width' => null, 
        '[new]' => false, 
        '[accessible]' => [ 
         '*' => true 
        ], 
        '[dirty]' => [], 
        '[original]' => [], 
        '[virtual]' => [], 
        '[errors]' => [], 
        '[invalid]' => [], 
        '[repository]' => 'Children' 

       }, 
       (int) 2 => object(Cake\ORM\Entity) { 

        'id' => (int) 11, 
        'subsite_id' => (int) 1, 
        'page_id' => (int) 14, 
        'parentmenuitem_id' => (int) 2, 
        'nav_order' => (int) 3, 
        'nav_width' => null, 
        '[new]' => false, 
        '[accessible]' => [ 
         '*' => true 
        ], 
        '[dirty]' => [], 
        '[original]' => [], 
        '[virtual]' => [], 
        '[errors]' => [], 
        '[invalid]' => [], 
        '[repository]' => 'Children' 

       } 
      ], 
      '[new]' => false, 
      '[accessible]' => [ 
       '*' => true 
      ], 
      '[dirty]' => [], 
      '[original]' => [], 
      '[virtual]' => [], 
      '[errors]' => [], 
      '[invalid]' => [], 
      '[repository]' => 'Menuitems' 

     }, 
    ], 
    '[new]' => false, 
    '[accessible]' => [ 
     '*' => true 
    ], 
    '[dirty]' => [], 
    '[original]' => [], 
    '[virtual]' => [], 
    '[errors]' => [], 
    '[invalid]' => [], 
    '[repository]' => 'Subsites' 

} 

]

+1

不應該說,它是@menulist而不是$菜單,然後在您的視圖的var_dump $菜單列表,看看它是什麼 –

+0

對不起,是的,我有$菜單列表,我在上面打印錯誤。 – Sharon

回答

1

在什麼( '菜單列表')變量的基礎上已設置,您的foreach應該是這樣的:

foreach($menulist->Menuitems as $item) 
{ 
    // your logic here 
} 

只需調試設置變量並查看數據是如何到來的,有時根據您的查詢可能會有所不同。

+0

當時忘了回覆,但是這有幫助,謝謝! – Sharon

1

您返回的數據是什麼樣的?您應該使用debug($menulist)檢查變量,或者查看debugkit中的設置視圖變量。在CakePHP 3中包含的模型應該在您的數據中顯示爲一個小寫的蛇套管項目(不像CakePHP 2中的模型別名),並且作爲hasMany關聯的複數形式,所以我希望您的案例可以像這樣: -

foreach ($menulist['menuitems'] as $item): 
    // Output your menu item 
endforeach; 
+1

如果modelname中沒有大寫字母(除了最初的那個),索引名稱中就不會有_。該示例清楚地顯示了Menuitems,而不是MenuItems。 – JvO

+0

@JvO很好發現,我已經更新了我的答案。 – drmonkeyninja

相關問題