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


Can I set the default order on the Table class on cakephp3

在模型中有一个属性$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_ordersort_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'
        ]
    ];
....