我可以在cakephp3上设置Table类的默认顺序吗
在CakePHP 2.x中,模型中有一个属性我可以在cakephp3上设置Table类的默认顺序吗,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,在CakePHP 2.x中,模型中有一个属性$order。所以我使用这个属性对数据进行全局排序。例如,假设我需要在用于添加行的Country模型中的视图上显示一个包含国家的选择框: $order = 'Country.country DESC'; 然后,当我从任何控制器获取国家时,数据按国家名称排序,而不是按id或任何其他字段排序。这对于选择框特别有用。在CakePHP3.x上,我在文档中似乎找不到任何类似的参考 在获取数据时,我是否可以做些什么来对数据进行全局排序,而不是在每次查找中使用or
$order
。所以我使用这个属性对数据进行全局排序。例如,假设我需要在用于添加行的Country
模型中的视图上显示一个包含国家的选择框:
$order = 'Country.country DESC';
然后,当我从任何控制器获取国家时,数据按国家名称排序,而不是按id
或任何其他字段排序。这对于选择框特别有用。在CakePHP3.x上,我在文档中似乎找不到任何类似的参考
在获取数据时,我是否可以做些什么来对数据进行全局排序,而不是在每次查找中使用order选项?只需重新添加您喜爱的属性,并使用表对象中的回调函数将属性中的值添加到查询中即可 或者只是: 并使用它
$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'] );
}
}
如果从外部设置了任何
顺序
,则跳过默认顺序。否则,它将始终按照排序字段\u名称
按照排序顺序
按照正式文档进行排序,请参见,您可以向控制器对象添加公共变量以设置默认排序顺序:
class InvoicesController extends AppController
{
public $paginate = [
'order' => [
'Invoices.id' => 'desc'
]
];
....
我建议使用
$this->aliasField('name')
,而不是使用->alias()
@burzum连接。是否有您所述的beforeFind选项的示例?请小心!这将是非常全球性的。
class InvoicesController extends AppController
{
public $paginate = [
'order' => [
'Invoices.id' => 'desc'
]
];
....