【问题标题】:How do I display retrieved data in CakePHP 3.0?如何在 CakePHP 3.0 中显示检索到的数据?
【发布时间】:2016-10-31 20:16:18
【问题描述】:

我使用 CakePHP 2.0 已经有一段时间了,我正在尝试迁移到 3.0。大部分都很好,但我对如何从表中检索数据并将其显示在视图中感到困惑。

假设我的数据库包含菜单和菜单项。每个 Menu 可以有多个 Menuitem(每个 Menuitem 记录都有字段 menu_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 ...
}

在 Cake 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,但这些也没有用。我哪里错了?

编辑

如果我这样做debug($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'

}
]

【问题讨论】:

  • 不应该是 @menulist 而不是 $menu 然后在你的视图中 var_dump $menulist 看看它是什么
  • 对不起,是的,我确实有 $menulist,我在上面打错了。

标签: cakephp cakephp-3.0


【解决方案1】:

根据您设置的 ('menulist') 变量,您的 foreach 应如下所示:

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

只需调试您设置的变量并查看数据的来源,有时可能会根据您的查询而有所不同。

【讨论】:

  • 当时忘记回复了,不过帮了大忙,谢谢!
【解决方案2】:

您返回的数据是什么样的?您应该使用 debug($menulist) 检查变量或查看 debugkit 中设置的视图变量。

在 CakePHP 3 中,包含的模型应该在您的数据中显示为小写蛇形项目(而不是像 CakePHP 2 中那样的模型别名)和 hasMany 关联的复数形式,所以我希望您的案例类似于这个:-

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

【讨论】:

  • 如果模型名中没有大写字母(除了第一个字母),则索引名称中不会有 _。该示例清楚地显示了菜单项,而不是菜单项。
  • @JvO 很好,我已经相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 2020-04-08
  • 1970-01-01
相关资源
最近更新 更多