2015-09-22 64 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' 
     ] 
    ]; 

.... 
相關問題