4

我一直在玩 CakePHP 3.0 的开发人员预览版,我一直在努力让新的 ORM 与分页一起工作。

在我的 PostsController.php 中,我有:

<?php

namespace App\Controller;

use App\Controller\AppController;

class PostsController extends AppController {

    public $name = 'Posts';

    public $uses = 'Posts';

    public $components = ['Paginator'];

    public $paginate = [
        'fields' => ['Posts.id'],
        'limit' => 1,
        'order' => [
            'Post.id' => 'asc'
        ]
    ];

    public function index() {

        $posts = $this->paginate('Posts');

        $this->set('posts', $posts);


    }

}

然而,分页正在工作,但数据没有回来。显然这是因为数据不是直接在新的 ORM 中返回,而是一个对象......有没有人尝试过这个?知道如何解决问题以使其与分页器一起使用吗?

我一直在阅读迁移指南:http ://book.cakephp.org/3.0/en/appendices/orm-migration.html但没有看到任何关于将它与分页器结合的信息。

注意:我无法调试 $posts 并在此处显示它,因为它大约有 2000 行代码,其中包含有关 ORM 的各种内容。这里是品尝师...

object(Cake\ORM\ResultSet) {
    [protected] _query => object(Cake\ORM\Query) {
        [protected] _table => object(Cake\ORM\Table) {
            [protected] _table => 'posts'
            [protected] _alias => 'Posts'
            [protected] _connection => object(Cake\Database\Connection) {
                [protected] _config => array(
                    'password' => '*****',
                    'login' => '*****',
                    'host' => '*****',
                    'database' => '*****',
                    'prefix' => '*****',
                    'persistent' => false,
                    'encoding' => 'utf8',
                    'name' => 'default',
                    'datasource' => object(Cake\Database\Driver\Mysql) {
                        [protected] _baseConfig => array(
                            'password' => '*****',
                            'login' => '*****',
                            'host' => '*****',
                            'database' => '*****',
                            'port' => '*****',
                            'persistent' => true,
                            'flags' => array(),
                            'encoding' => 'utf8',
                            'timezone' => null,
                            'init' => array(),
                            'dsn' => null
                        )
                        [protected] _config => array(
                            'password' => '*****',
                            'login' => '*****',
                            'host' => '*****',
                            'database' => '*****',
                            'port' => '*****',
                            'prefix' => '*****',
                            'persistent' => false,
                            'encoding' => 'utf8',
                            'name' => 'default',
                            'flags' => array(),
                            'timezone' => null,
                            'init' => array(),
                            'dsn' => null
                        )
                        [protected] _autoQuoting => false...

因此,您可以看到它是一个巨大的对象,并且可能数据就在其中的某个地方。

4

2 回答 2

2

显然这是因为数据不是直接在新的 ORM 中返回,而是一个对象......

这不是一个错误,这是一个功能。;) 如您所见,CakePHP3 返回一个ResultSet对象和记录的实体对象。您现在必须使用这些对象而不是数组。

如果您真的阅读了您链接的迁移指南,我会感到很困惑,因为它都在里面:

  • Cake\ORM\ResultSet - 一个结果集合,提供了强大的工具来处理聚合数据。
  • Cake\ORM\Entity - 表示单行结果。使访问数据和序列化为各种格式变得轻而易举。

在该页面的下方,还有更多关于此的信息。看看 ResultSet API。你会看到它实现了Iterator,你可以像数组一样使用它:

控制器方法:

public function index() {
    $this->set('users', $this->Paginator->paginate($this->Users, [
        'limit' => 5,
        'conditions' => [
            'Users.active' => 1
        ]
    ]));
}

在 paginate() 方法的 doc 块中有很多文档可供阅读

查看 index.ctp:

foreach ($users as $user) {
    debug($user);
}

这将向您显示实体对象。我没有在这里粘贴整个长调试输出,只是其中的一部分。

object(Cake\ORM\Entity) {
    [protected] _properties => array(
        'password' => '*****',
        'id' => '52892217-91ec-4e5d-a9f4-1b6cc0a8000a',
        'username' => 'burzum',
        'slug' => '',
        // ...

要从对象中获取某些东西,只需执行以下操作:

echo $user->username;

实际数据位于受保护的属性中Entity::$_properties,并由__get访问。

于 2014-01-09T23:46:42.023 回答
0

这将在您的控制器中。

public function index() {
         $this->set('users', $this->paginate($this->Users));
         $this->set('_serialize', ['users'])
}

你可以把它放在你的行动中

分页逻辑

于 2015-05-08T12:12:21.133 回答