在CakePHP 2.x中,模型中有一个属性$order
。所以我使用这个属性来全局排序我的数据。因此,例如,假设我需要在用于添加该行的Country
模型中的视图上显示包含国家/地区的选择框:
$order = 'Country.country DESC';
然后当我从任何控制器获取国家/地区时按国家/地区名称而不是id
或任何其他字段排序的数据。这对于选择框特别有用。在CakePHP 3.x上,我似乎无法在文档中找到任何类似的参考。
当我获取数据并且不在每个查找中使用订单选项时,我可以做些什么来全局排序我的数据?
答案 0 :(得分:6)
在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_order
。
答案 1 :(得分:4)
您可以覆盖表类中的findAll方法。
public function findAll(Query $query, array $options)
{
return $query->order(['Country.country' => 'DESC']);
}
答案 2 :(得分:3)
只需添加您心爱的属性,然后使用Table对象中的beforeFind()回调将属性中的值添加到查询中。
public function findOrdered(Query $query, $options) {
return $query->order([
$this->alias() . '.name' => 'ASC'
]);
}
并使用它
$this->find('list')->find('ordered')->all();
或者创建一个返回整个有序列表的有序列表find。
public function findOrderedList(Query $query, $options) {
return $this->findList($query, $options)
->order([
$this->alias() . '.name' => 'ASC'
]);
}
直接重载findList()方法并调用父。
或者,如果您通过关系调用find()
,则可以sort
选项使用set the default order for the relationship。
$this->hasMany('AuditLogs', [
'sort' => [
'AuditLogs.timestamp' => 'desc',
],
]);
答案 3 :(得分:3)
CakePHP3.x:
如果您想为模型中与此模型相关的每个查询对模型中的数据进行排序,您可以通过beforeFind简单地在模型文件中对查询进行排序:
public function beforeFind(Event $event, Query $query, $options, $primary) {
$query->order(['Model.field' => 'ASC']);
return $query;
}
答案 4 :(得分:2)
根据官方文档,请参阅cakephp book,您可以向控制器对象添加公共变量,以便设置默认排序顺序:
class InvoicesController extends AppController
{
public $paginate = [
'order' => [
'Invoices.id' => 'desc'
]
];
....