В CakePHP 2.x в моделях было свойство $order
. Поэтому я использовал это свойство для заказа моих данных по всему миру. Так, например, предполагая, что мне нужно отобразить поле выбора со странами в представлении в моей модели Country
используемой для добавления строки:
$order = 'Country.country DESC';
а затем, когда я привел страны из любого контроллера данные, заказанные по названию страны, а не по id
или другому полю. Это было очень полезно для ящиков выбора. На CakePHP 3.x я не могу найти какую-либо аналогичную ссылку в документации.
Есть ли что-нибудь, что я могу сделать, чтобы мои данные сортировались по всему миру, когда я их получаю, а не использовать параметр заказа в каждой находке?
Просто добавьте свою любимую собственность и используйте обратный вызов beforeFind () в объекте Table, чтобы добавить значение из свойства в запрос.
Или просто создайте пользовательский поиск :
public function findOrdered(Query $query, $options) { return $query->order([ $this->alias() . '.name' => 'ASC' ]); }
И использовать его
$this->find('list')->find('ordered')->all();
Или создайте упорядоченный список, который возвращает весь упорядоченный список.
public function findOrderedList(Query $query, $options) { return $this->findList($query, $options) ->order([ $this->alias() . '.name' => 'ASC' ]); }
Или перегрузите метод findList () напрямую и вызовите родителя.
Или, если ваша find()
вызывается через отношения, вы можете установить порядок по умолчанию для отношений , используя опцию sort
.
$this->hasMany('AuditLogs', [ 'sort' => [ 'AuditLogs.timestamp' => 'desc', ], ]);
Вы можете переопределить метод findAll в своем классе таблицы.
public function findAll(Query $query, array $options) { return $query->order(['Country.country' => 'DESC']); }
CakePHP3.x:
Если вы хотите отсортировать данные в своей модели для каждого запроса, связанного с этой моделью, вы можете просто запросить запрос в файле модели через beforeFind:
public function beforeFind(Event $event, Query $query, $options, $primary) { $query->order(['Model.field' => 'ASC']); return $query; }
В CakePHP 3.x, если вы хотите так настроить порядок по умолчанию для каждого запроса модели, вы можете поместить следующий код в свою таблицу:
public function beforeFind ($event, $query, $options, $primary) { $order = $query->clause('order'); if ($order === null || !count($order)) { $query->order( [$this->alias() . '.sort_field_name' => 'sort_order'] ); } }
Если какой-либо order
установлен снаружи, он пропускает порядок по умолчанию. В противном случае он будет сортироваться по sort_field_name
соответствии с sort_field_name
.
Согласно официальным документам, см. Книгу cakephp , вы можете добавить публичную переменную к объекту контроллера, чтобы установить порядок сортировки по умолчанию:
class InvoicesController extends AppController { public $paginate = [ 'order' => [ 'Invoices.id' => 'desc' ] ]; ....