Blog

Live Suche

PHP Array Boost: Lavarel Collections für jedes Projekt

​Na, schon einmal mit Laravel entwickelt? Falls deine Antwort hierauf wirklich "nein" sein sollte, solltest du einen Blick auf laracasts.com werfen. Falls "JA!" deine Antwort ist, wirst du sicherlich einige Funktionen ins Herz geschlossen haben. Manchmal ist es leider nicht möglich das komplette Framework in einem Projekt einzusetzen. Traurig, nicht wahr? Aber keine Angst, ein Power-Feature kannst du bequem in deine Projekte einbinden: Laravel Collections!  

Die Collection Klasse ist der Hammer. In Laravel werden Datenbankabfragen als Collection Objekt zurückgegeben, welches die Ergebnisse beinhaltet. Die Klasse enthält jede Menge nützlicher Methoden die dir die Arbeit viel einfacher machen. Wenn ich mit externen API´s arbeite, verpacke ich die Ausgaben in eine Collection um mit den Methoden arbeiten zu können. Das habe ich eine ganze Zeit lang bei Projekten ohne Laravel vermisst. Nun bin ich aber über die einzelne Auslagerung auf Github gestoßen:


 Ab sofort kann ich mittels Composer meine Arrays tunen:

composer require tightenco/collect 

Beispiel Amazon API

Dieses Beispiel ist ein fiktiver Aufruf der Amazon Product Advertising API. Es gehört ein wenig mehr dazu um die Produkte als JSON String zu erhalten und an die Bewertungen zu kommen, aber für einen ersten Eindruck über die Möglichkeiten die sich einem bietet, sollte es anschaulich genug sein:

use Illuminate\Support\Collection;

// Fiktiver Abruf der Produkte in der Amazon Kategorie "Monitore"
$results = json_decode($Amazon->getNodeProducts(429868031));

// In eine Collection einbetten
// Variante 1
$collection = new Collection($results);
// Variante 2
$collection = collect($results);


// Absteigende Sortierung nach Bewertungen.
$leaderboard = $collection->sortByDesc('rating');

// Nehme die Top 5 Monitore
$top5 = $leaderboard->take(5); 

Beispiel Musikliste

​Um dir ein weiteres einfaches Beispiel zu geben, gehe ich nun von einer Songliste aus irgendeiner Datenbank aus, welche ich gerade um einen Auszug gebeten habe:

$music = [
    [
    'id' => '1',
    'album_id' => '1',
    'name' => 'Songname 1',
    'length' => '2',
    'created_at' => '2017-01-09 10:59:32',
    'updated_at' => '2017-11-09 10:59:32',
    ],
    [
    'id' => '2',
    'album_id' => '1',
    'name' => 'Songname 2',
    'length' => '12',
    'created_at' => '2017-01-08 10:20:00',
    'updated_at' => '2017-11-08 10:59:32',
    ],
    [
    'id' => '3',
    'album_id' => '1',
    'name' => 'Songname 3',
    'length' => '4',
    'created_at' => '2017-01-01 10:59:32',
    'updated_at' => '2017-10-01 10:59:32',
    ],
    [
    'id' => '4',
    'album_id' => '1',
    'name' => 'Songname 4',
    'length' => '3',
    'created_at' => '2017-01-19 10:59:32',
    'updated_at' => '2017-11-01 08:02:11',
    ],
    [
    'id' => '5',
    'album_id' => '1',
    'name' => 'Songname 5',
    'length' => '5',
    'created_at' => '2017-04-29 10:59:32',
    'updated_at' => '2017-05-29 06:11:59',
    ],
    [
    'id' => '6',
    'album_id' => '1',
    'name' => 'Songname 6',
    'length' => '4',
    'created_at' => '2017-06-03 18:59:32',
    'updated_at' => '2017-06-03 18:59:32',
    ],
    [
    'id' => '7',
    'album_id' => '1',
    'name' => 'Songname 7',
    'length' => '2',
    'created_at' => '2017-07-09 10:59:32',
    'updated_at' => '2017-11-09 10:59:32',
    ],
    [
    'id' => '8',
    'album_id' => '1',
    'name' => 'Songname 8',
    'length' => '2',
    'created_at' => '2017-05-09 09:29:12',
    'updated_at' => '2017-06-09 10:59:32',
    ],
    [
    'id' => '9',
    'album_id' => '1',
    'name' => 'Songname 9',
    'length' => '2',
    'created_at' => '2017-11-09 11:11:11',
    'updated_at' => '2017-11-09 11:11:11',
    ],
    [
    'id' => '10',
    'album_id' => '1',
    'name' => 'Songname 10',
    'length' => '2',
    'created_at' => '2017-11-09 12:15:12',
    'updated_at' => '2017-11-09 12:15:12',
    ],
];

$collection = collect($music); 

Natürlich gibt es diverse Möglichkeiten die Datenbankabfrage vorzubereiten, sodass diese bereits ein vorgefertigtes Ergebnis liefert. Was ist aber, wenn du mehrere Operation mit den Daten machen müsstest? Vielleicht sind auf der selben Webseite verschiedene Informationen aus der gleichen Datenquelle nötig. Willst du also für jede kleine Operation eine neue Datenbankverbindung aufbauen? Naja, es kommt drauf an! In diesem Beispiel wäre es aber eine unnötige Verschwendung von Ressourcen und ineffizient. ;)

Nun ein paar einfache Beispiele, welche Möglichkeiten dir die Laravel Collection Klasse bietet:

first()

Liefert das erste Element aus der Collection. 

$collection->first();

//Array (
//    'id' => '1',
//    'album_id' => '1',
//    'name' => 'Songname 1',
//    'length' => '2',
//    'created_at' => '2017-01-09 10:59:32',
//    'updated_at' => '2017-11-09 10:59:32',
//);
 

last()

Liefert das letzte Element aus der Collection. 

$collection->last();

//Array (
//    'id' => '10',
//    'album_id' => '1',
//    'name' => 'Songname 10',
//    'length' => '2',
//    'created_at' => '2017-11-09 12:15:12',
//    'updated_at' => '2017-11-09 12:15:12',
//);
 

pluck()

Ruft alle Werte für einen bestimmten Schlüssel ab:

$plucked = $collection->pluck('name');
$plucked->all();

//Array ( 
//  0 => 'Songname 1', 
//  1 => 'Songname 2', 
//  2 => 'Songname 3', 
//  3 => 'Songname 4', 
//  4 => 'Songname 5', 
//  5 => 'Songname 6', 
//  6 => 'Songname 7', 
//  7 => 'Songname 8',
//  8 => 'Songname 9',
//  9 => 'Songname 10'
//)
 

sum()

Summiert alle Werte oder alternativ alle Werte eines bestimmten Schlüssels. Wie lange ist die Spieldauer des Albums? Nichts leichter als das:

$collection->sum('length');

// 38
 

where()

Nimm an, du hättest eine viel größere Datenmenge und müsstest die Gesamtspieldauer von einem bestimmten Album haben. Hier kommt die Methode where() ins Spiel, welche die Collection anhand der Key - Value Paare filtert:

$collection->sum('length')->where('album_id', 15);

// 89
 

Es warten noch jede Menge weitere hilfreiche Methoden auf dich. Zum Beispiel um Daten zu sortieren ( sortBy() ), neu zu gruppieren ( groupBy()​ ), zu durchsuchen ( contains()​ , has() ). Hier konnte ich nur eine handvoll der Möglichkeiten andeuten. Ich hoffe du konntest einen Eindruck bekommen, wieso du in deinem nächsten Projekt nicht auf die Collections verzichten solltest ;).

​Und? Begeistert? Ja dann solltest du dir die Dokumentation der Laravel Collections mal anschauen: 

https://laravel.com/docs/5.5/collections

Ort (Karte)

0
Multidimensionales Array zu Collection of Collecti...
Rekursive Suche: Multidimensionale Arrays & Object...

Ähnliche Beiträge

Ich stimme zu, dass diese Seite Cookies für Analysen verwendet.