2015-08-13 20 views
6

Sono un po 'bloccato su qualcosa che di solito è abbastanza semplice. Ho bisogno di ordinare i record da una relazione hasMany in un ordine personalizzato basato su un certo valore e una matrice di "ordinamento".Ordinamento personalizzato su una collezione di relazioni laravel

Il mio codice qui sotto non funziona perché sto passando uSort() una raccolta eloquente e non sono sicuro di come aggirarlo.

$go = $this->hasMany('Product')->orderBy('colour','DESC'); 

$order = array('RED', 'GREEN', 'BLUE', 'YELLOW'); 

usort($go, function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 

return $go; 

Forse mi manca qualche incredibile assistente magico di laravel, ma sono bloccato. Qualsiasi pensiero o consiglio sarebbe molto apprezzato!

Acclamazioni

+0

Puoi prega di inviare la struttura dell'array di '$ go' come' print_r ($ go) 'insieme all'output atteso –

risposta

5

Il usort equivalente per Collection è il sort() metodo. Prende un callback come parametro e restituisce la raccolta ordinata.

Quindi nel tuo caso, la soluzione è:

$go = $go->sort(function ($a, $b) use ($order) { 
    $pos_a = array_search($a->colour, $order); 
    $pos_b = array_search($b->colour, $order); 
    return $pos_a - $pos_b; 
}); 
+0

Questo ha funzionato dopo averlo spostato all'esterno della definizione della relazione, poiché le funzioni di relazione devono restituire una relazione. Grazie per l'ottimo esempio! –

1

vostro ordinamento verrà applicato solo dopo aver ottenuto il risultato mentre qui $go = $this->hasMany('Product')->orderBy('colour','DESC'); sono solo entrare un'istanza di una classe che restituirà può tornare il tuo risultato se applichi un metodo get su di esso.

per il vostro scopo è necessario utilizzare sortBy method di laravel collections dopo aver ottenuto il risultato dei tuoi dati è possibile trovare ulteriori (laravel Collection sortBy() method) & ecco un simile risposta domanda per voi https://stackoverflow.com/a/28202985

+0

Grazie per le informazioni sull'applicazione di questo al di fuori della funzione di relazione. Tra te e jedrzej hai risolto il mio problema, evviva! –

Problemi correlati