2015-04-27 3 views
7

У меня есть две модели пользователей & ролейCakePHP 3.x Сортировка другой модели не работает

Здесь «Роли hasMany пользователей» и «Пользователи belongsTo роли»

Когда пользователь спас мы также просим пользовательская роль & запись записано.

Задача: У меня есть список пользователей с именем, фамилией, ролями. Каждый & Каждый столбец имеет сортировку, но при сортировке ролей не работает.

Таблица ролей содержит поле «имя» для имени роли. Я ссылался ниже, но он не работает для меня. Pagination Sort in Cakephp 3.x

UsersController:

public function index() { 
    $this->paginate = [ 
       'contain' => ['Roles'], 
       'conditions' => [ 
        'Users.user_type <>' => 1 
       ] 
      ]; 

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

index.ctp

<tr> 
       <th><?php echo $this->Paginator->sort('firstname',__('First Name')) ?></th> 
       <th><?php echo $this->Paginator->sort('lastname',__('Last Name')) ?></th> 
       <th><?php echo $this->Paginator->sort('email',__('Email Address')) ?></th> 
       <th><?php echo $this->Paginator->sort('Roles.name',__('Role Associated')) ?></th> 
       <th><?php echo $this->Paginator->sort('status',__('status')) ?></th> 
       <th class="actions"><?php echo __('action') ?></th> 
      </tr> 

Позвольте мне знать, любое решение, которое вы имеете.

+0

ли вы найти решение? – user2340939

ответ

1

UsersController.php

$this->paginate = [ 
      'contain' => ['Roles'], 
      'conditions' => [ 
       'Users.user_type <>' => 1 
      ], 
      'order' => ['Users.role_id' => 'ASC'] 
     ]; 

Используйте 'порядок' => [ 'Models.field' => 'ASC/DESC']

+0

Спасибо за ответ, но я хочу Сортировка. Сортировка в поле «Связанные роли», щелкнув. –

+0

Попробуйте использовать ключ «сортировка», который содержит: http://book.cakephp.org/3.0/en/orm/query-builder.html#sorting-contained-associations –

-1

(я бы добавить комментарий к вам вопрос, но У меня недостаточно очков репутации.)

У меня такая же проблема.

Это происходит из-за того, как работает сдерживающее поведение. Когда CakePHP получает все роли для связанного пользователя, он выдает отдельный запрос (вместо использования соединения в основном запросе). Затем он объединяет все вместе в хороший объект для использования. Взгляните на sql в комплекте для отладки.

Когда вы запрашиваете у него сортировку по имени роли, это невозможно, потому что в главном запросе таблицы не найдены. Я предполагаю, что Вы получаете сообщение об ошибке, как это:

Error: SQLSTATE[HY000]: General error: 1 no such column: Roles.name

Чтобы сделать эту работу, вы будете иметь, чтобы выяснить, как соединить таблицу ролей в таблице пользователей в основном запросе для этого Работа. Вот почему это работает по-другому. Если таблица «Пользователи» принадлежала таблице «Роли», у вас не было бы этой проблемы, потому что таблица «Роли» была бы объединена в основном запросе.

Другим способом заставить его работать может быть использование модели ролей для основного запроса. Но если в вашей таблице пользователя есть другие hasMany ассоциации, которые вы хотите отсортировать, это не сработает. (Это мой случай.)

Я только начал входить в CakePHP 3, так что у меня действительно нет конкретного ответа на данный момент, но я надеюсь, что это указывает на то, что вы в правильном направлении.

18

Вы просто должны использовать это:

$this->paginate = [ 
    'sortWhitelist'=>['Roles.name'] 
]; 
+3

Чтобы быть более точным: у вас также есть чтобы включить все остальные столбцы, которые вы хотите отсортировать. В контроллер-Action 'код $ this-> постраничной = [ 'содержит' => [ 'роли'], 'sortWhitelist' => [ 'Roles.name', 'Firstname', 'фамилия', ' email ',' status '] ]; ' [ссылка] (http://book.cakephp.org/3.0/en/controllers/components/pagination.html#control-which-fields-used-for-ordering) – Tobse