Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在cakephp3上设置Table类的默认顺序吗_Php_Cakephp_Cakephp 3.0 - Fatal编程技术网

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

我可以在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

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

....