2015-09-22 68 views
6

在CakePHP 2.x中,模型中有一个属性$order。所以我用这个属性在全球范围内订购我的数据。因此,例如,假设我需要显示与一个观点的国家选择框在我用来添加行Country型号:我可以在cakephp3上的Table类上设置默认顺序:

$order = 'Country.country DESC'; 

,然后当我获取的国家从任何控制器,其中所订购的数据国名,而不是id或任何其他字段。这对于选择框特别有用。在CakePHP 3.x上,我似乎无法在文档中找到任何类似的参考。

有什么我可以做的,让我的数据全球排序,当我获取他们,而不是在每次查找使用顺序选项?

回答

3

只需将您心爱的属性添加回来,并使用Table对象中的beforeFind()回调函数将该属性中的值添加到查询中即可。

或者只是create a custom finder

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选项set the default order for the relationship

$this->hasMany('AuditLogs', [ 
    'sort' => [ 
     'AuditLogs.timestamp' => 'desc', 
    ], 
]); 
+0

我建议你'$这个 - > aliasField(” name')'而不是' - > alias()'连接' –

+0

@burzum有没有你说过的beforeFind选项的例子? – khany

+2

https://github.com/UseMuffin/Orderly – ADmad

4

您可以在表类中重写findAll方法。

public function findAll(Query $query, array $options) 
{ 
    return $query->order(['Country.country' => 'DESC']); 
} 
+0

小心!将非常全球。 –

3

CakePHP3.x:

如果您想为每一个与此相关的模型查询模型中的数据进行排序,你可以简单的为了通过beforeFind在模型文件中查询:

public function beforeFind(Event $event, Query $query, $options, $primary) { 

    $query->order(['Model.field' => 'ASC']); 
    return $query; 

} 
3

在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排序。

1

根据官方文档,看cakephp book,你可以以设置默认排序顺序公开变量添加到控制器对象:

class InvoicesController extends AppController 
{ 
    public $paginate = [ 
     'order' => [ 
       'Invoices.id' => 'desc' 
     ] 
    ]; 

.... 
相关问题