2015-09-22 13 views
6

In CakePHP 2.x c'era una proprietà $order in Modelli. Quindi ho usato questa proprietà per ordinare i miei dati a livello globale. Così, per esempio ipotizzando che ho bisogno di mostrare una casella di selezione con i paesi su una vista nel mio modello Country utilizzato per aggiungere la riga:Posso impostare l'ordine predefinito sulla classe Tabella su cakephp3

$order = 'Country.country DESC'; 

e poi quando Presi i paesi da qualsiasi controllo dei dati in cui ordinate per la nome del paese e non dal id o da qualsiasi altro campo. Questo è stato molto utile specialmente per le caselle di selezione. Su CakePHP 3.x non riesco a trovare riferimenti simili nella documentazione.

C'è qualcosa che posso fare per avere i miei dati ordinati a livello globale quando li prelevo e non uso l'opzione ordine in ogni ricerca?

risposta

3

È sufficiente aggiungere nuovamente la proprietà desiderata e utilizzare la richiamata beforeFind() nell'oggetto Tabella per aggiungere il valore dalla proprietà alla query.

O semplicemente create a custom finder:

public function findOrdered(Query $query, $options) { 
    return $query->order([ 
     $this->alias() . '.name' => 'ASC' 
    ]); 
} 

e usarlo

$this->find('list')->find('ordered')->all(); 

o creare un elenco ordinato scoperta che restituisce l'intero elenco ordinato.

public function findOrderedList(Query $query, $options) { 
    return $this->findList($query, $options) 
    ->order([ 
     $this->alias() . '.name' => 'ASC' 
    ]); 
} 

Oppure sovraccaricare direttamente il metodo findList() e chiamare il genitore.

Oppure se il tuo find() viene chiamato tramite una relazione, è possibile set the default order for the relationship utilizzando l'opzione sort.

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

mi consiglia '$ this-> aliasField (' nome ') 'invece della concatenazione con' -> alias() ' –

+0

@burzum c'è un esempio dell'opzione beforeFind che hai specificato? – khany

+2

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

4

È possibile eseguire l'override del metodo findAll nella classe della tabella.

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

Fai attenzione! Sarà molto GLOBALMENTE. –

3

CakePHP3.x:

Se volete ordinare i dati nel modello per ogni query relative a questo modello, è possibile ordinare semplice la query nel file del modello tramite beforeFind:

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

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

} 
3

in CakePHP 3.x, se si vuole così impostato ordine predefinito per ogni query di un modello, allora è possibile inserire codice riportato nella tabella:

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']); 
    } 
} 

Se uno qualsiasi order impostato dall'esterno, salta l'ordine predefinito. Altrimenti, ordinerà sempre per sort_field_name in base a sort_order.

1

Secondo la documentazione ufficiale, vedere cakephp book, è possibile aggiungere una variabile pubblica per l'oggetto controller per impostare l'ordine predefinito:

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

....