2016-11-22 2 views
2

Ich habe ein Array von IDs wie folgt:Sortieren Kollektion von kundenspezifischen Auftrag in Eloquent

$ids = [5,6,0,1] 

Mit Eloquent Ich bin für diese IDs mit der ->whereIn('id', $ids) Funktion suchen können. Wie erwartet werden die Ergebnisse in aufsteigender Reihenfolge nach ID zurückgegeben. Gibt es eine Möglichkeit, die Ergebnisse in der Reihenfolge zurückzugeben, in der sich das Array befindet? alternativ was ist der einfachste Weg, um die Sammlung in der Reihenfolge der $ids Array zu konvertieren?

Antwort

5

Wenn es eine bestimmte Reihenfolge ist man in den Aufzeichnungen haben, würden Sie die Collection Methods verwenden müssen:

Um die IDs in der sehr spezifischen Bestellung erhalten Sie angegeben haben, können Sie die Verwendung des sortBy Verfahren machen wie folgt, wobei Sammlung Ihrer Sammlung von Modellen ist:

$ids = [ 5, 6, 0, 1]; 

$sorted = $collection->sortBy(function($model) use ($ids) { 
    return array_search($model->getKey(), $ids); 
}); 

// [ 5, 6, 0, 1] // (desired order) 

Um Ihre Sammlung zu randomisieren, können Sie die Methode shuffle verwenden.

$collection = collect([1, 2, 3, 4, 5]); 

$shuffled = $collection->shuffle(); 

$shuffled->all(); 

// [3, 2, 5, 1, 4] // (generated randomly) 

Siehe Laravel Docs auf shuffle und/oder sortBy für spezifischere Anforderungen.

Wenn Sie nicht wirklich eine bestimmte Reihenfolge im Kopf haben, können Sie ->inRandomOrder() in Version 5.2 und höher verwenden, ältere Versionen erfordern die rohe Abfrage mit ->orderBy(DB::raw('RAND()')).

+1

Sie verpassen ")" in Ihrem $ sortierten Code-Snippet oben. –

+0

Fehlender Tippfehler behoben, danke. – snh

0

Sie eine Funktion in das sortBy Methode übergeben können komplexe Sortierung auszuführen:

$ids = [5,6,0,1]; 

$collection = YourModel::whereIn('id', $ids)->sortBy(function($model) use ($ids) { 
    // Access your array order here and modify the sorting here 
}); 
Verwandte Themen