在模型中有一个属性$order
。我使用这个属性对数据进行全局排序。例如,假设我需要在Country
模型的视图中显示一个带有国家的选择框,用于添加以下行:
$order = 'Country.country DESC';
然后,当我从任何控制器获取国家时,数据按国家名称排序,而不是按id
或任何其他字段排序。这是非常有用的,特别是对于选择框。在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_order
按sort_field_name
排序。
只需将您喜爱的属性添加回来,并在Table对象中使用beforeFind()回调将属性的值添加到查询中。
或者直接创建一个自定义查找器:
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书籍,您可以向控制器对象添加公共变量,以便设置默认排序顺序:
class InvoicesController extends AppController
{
public $paginate = [
'order' => [
'Invoices.id' => 'desc'
]
];
....