我可以在cakephp3上的Table类中设置默认顺序

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选项时,我可以做些什么来使我的数据全局排序?

mon*_*hoq 7

在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.


bur*_*zum 5

只需添加您心爱的属性并使用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)