gmp*_*nos 6 php cakephp cakephp-3.0
在CakePHP 2.x $order
中,模型中有一个属性.所以我使用这个属性来全局排序我的数据.因此,例如假设我需要在我的Country
模型中的视图中显示带有国家/地区的选择框,用于添加行:
$order = 'Country.country DESC';
Run Code Online (Sandbox Code Playgroud)
然后当我从任何控制器获取国家时,按国家名称而不是由id
任何其他字段排序的数据.这对于选择框特别有用.在CakePHP 3.x上,我似乎无法在文档中找到任何类似的参考.
当我获取数据并且不在每个查找中使用order选项时,我可以做些什么来使我的数据全局排序?
在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'] );
}
}
Run Code Online (Sandbox Code Playgroud)
如果order
来自外部的任何设置,它会跳过默认顺序.否则,它将永远排序sort_field_name
依据sort_order
.
只需添加您心爱的属性并使用Table 对象中的beforeFind()回调将属性中的值添加到查询中。
或者只是创建一个自定义查找器:
public function findOrdered(Query $query, $options) {
return $query->order([
$this->alias() . '.name' => 'ASC'
]);
}
Run Code Online (Sandbox Code Playgroud)
并使用它
$this->find('list')->find('ordered')->all();
Run Code Online (Sandbox Code Playgroud)
或者创建一个有序列表 find 来返回整个有序列表。
public function findOrderedList(Query $query, $options) {
return $this->findList($query, $options)
->order([
$this->alias() . '.name' => 'ASC'
]);
}
Run Code Online (Sandbox Code Playgroud)
或者直接重载 findList() 方法并调用父级。
或者,如果您find()
通过关系被调用,您可以使用该选项设置关系的默认顺序sort
。
$this->hasMany('AuditLogs', [
'sort' => [
'AuditLogs.timestamp' => 'desc',
],
]);
Run Code Online (Sandbox Code Playgroud)