【问题标题】:Pagination in CakePHP 3.0CakePHP 3.0 中的分页
【发布时间】:2016-02-04 21:44:11
【问题描述】:

我一直在使用 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...

如您所见,它是一个巨大的对象,并且可能数据就在其中。

【问题讨论】:

  • debug($posts-&gt;toArray()); 的作用是什么?

标签: php cakephp pagination cakephp-3.0


【解决方案1】:

显然这是因为数据不是直接在新的 ORM 只是一个对象...

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

如果你真的阅读了你所链接的迁移指南,我会很高兴,因为它都在里面:

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

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

控制器方法:

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

paginate() 方法的 doc 块中有a lot of documentation to read

查看 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 访问。

【讨论】:

  • 没有说这是一个错误,我不明白如何让这种获取数据的新方法与分页组件一起使用。
  • 好吧,你已经得到了数据。 ;) 通过 foreach 运行结果并对其进行调试,然后您将看到 post 实体对象。
  • 您能否举例说明您认为它如何与分页组件一起使用?可能会帮助我更了解这一点。谢谢。
  • 你在你的视图中放了什么来显示数据?这将不再是这样做的方式吗? &lt;?php echo $post['Post']['title']; ?&gt;
  • echo $user->用户名; $post->标题;就像我多次说过的那样:它是一个对象,不再是一个数组。实际数据位于受保护的属性 _properties 中,并由魔术 __get 访问。
【解决方案2】:

这将在您的控制器中。

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

这你可以付诸行动

分页逻辑

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多