2014-01-09 10 views
3

Я играю с версией предварительного просмотра разработчика CakePHP 3.0, и я застреваю, пытаясь заставить новую ОРМ работать с разбиением на страницы.Pagination in CakePHP 3.0

В моей 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, а объект ... Кто-нибудь еще это пробовал? Знает, как исправить проблему, чтобы заставить ее работать с paginator?

Я читал руководство по миграции: http://book.cakephp.org/3.0/en/appendices/orm-migration.html, но ничего не вижу в объединении его с paginator.

Примечание: я не могу отлаживать $ 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... 

Так как вы можете видеть, что это огромный объект и, предположительно, данные где-то внутри него.

+0

что вы получите с 'отладки ($ posts-> ToArray());'? – lp1051

ответ

2

Видимо, это потому, что данные не сразу возвращается в новом ОРМ, но объект ...

Это не ошибка, это особенность. ;) CakePHP3 возвращает объект ResultSet, как вы можете видеть, и объекты объекта для записей. Теперь вам придется работать с этими объектами вместо массивов.

Я wounder, если вы действительно прочитать руководство по миграции вы связаны, потому что это все там:

  • торта \ 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 
     ] 
    ])); 
} 

Существует в док блока метода постраничной() a lot of documentation to read.

Просмотр index.ctp:

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

Это покажет вам объекты Entity. Я не вставляю весь длинный отладочный вывод здесь, только часть его.

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

Чтобы получить что-то от объекта обратно просто сделать это:

echo $user->username; 

Фактические данные в защищенной собственности Entity::$_properties и доступ к __get.

+1

Не сказал, что это была ошибка больше Я не понимаю, как получить этот новый способ получения данных для работы с компонентом разбиения на страницы. – Cameron

+0

Ну, у вас уже есть данные. ;) Запустите результат через foreach и отлаживайте его, тогда вы увидите объекты post entity. – burzum

+0

Не могли бы вы показать пример того, как вы думаете, что он будет работать с компонентом разбивки на страницы? Могу помочь мне понять это. Благодарю. – Cameron

0

Это будет в вашем контроллере.

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

Это вы можете положить в действие

Paginatore логика