2015-06-08 9 views
6

Ich versuche, eine Sammlung nach der Spalte name zu sortieren. Ich bin Protokollierung der Ajax-Ergebnis und wenn ich sortiere nach name ich:Laravel - sortierte Sammlungsausgabe ist kein Array

Object: {0: Object, 1: Object, ...}

Aber wenn ich sortiere nach dem anderen Feld (locationId) erhalte ich:

[Object, Object, ...]

Jede Idee, was Ich mache falsch? Ich brauche das Ergebnis in einem Array wie beim Sortieren nach locationId.

public function getLocations() 
{ 
    return \Location::all(['locationId', 'name'])->sortBy('name'); 
} 
+0

sieht gut aus. Könnten Sie einen anderen relevanten Code posten? – chanafdo

Antwort

10

Wenn Sie sortieren nach locationId, nicht ändern, die Schlüssel für die Elemente, da die Elemente bereits auf diese Weise sortiert wurden. Zum Beispiel würden die Schlüssel 0, 1, 2 usw. bleiben, was ein gültiges indiziertes Array ist.

Wenn Sie jedoch nach dem Feld name sortieren, werden die Schlüssel mit dem Objekt verschoben, auf das sie verweisen. Ihre Schlüssel können also wie 0, 2, 1 usw. enden. Da diese Reihenfolge der Schlüssel kein gültiges indiziertes Array ist, wird sie als assoziatives Array behandelt, das in ein Objekt in json übersetzt wird.

Sie müssen nur das Elementarray nach der Sortierung erneut eingeben. Die Sammlung verfügt über eine values() Methode, um dies zu tun.

public function getLocations() 
{ 
    return \Location::all(['locationId', 'name'])->sortBy('name')->values(); 
} 
+1

Ah-ha, das war's! Danke für die Erklärung. – jstudios

1

Wenn Sie loswerden numerischen Tasten bekommen Sie verwenden sollten:

return \Location::all(['locationId', 'name'])->sortBy('name')->values()->all(); 

Reference - sortBy

+0

Durch das Hinzufügen der 'all()' -Methode wird ein Array der zugrunde liegenden Elemente zurückgegeben, nicht das Collection-Objekt. Die ursprüngliche Funktion hat die Collection zurückgegeben, daher würde ich annehmen, dass dieser Rückgabetyp nicht geändert werden sollte. – patricus