Laravel Collection adalah salah satu fitur paling powerful yang sering diremehkan oleh developer pemula. Collection adalah pembungkus (wrapper) yang elegan untuk bekerja dengan array data, menyediakan puluhan method bawaan yang memudahkan manipulasi data tanpa perlu menulis loop manual. Setelah membaca artikel ini, kamu akan menggunakan Collection secara lebih cerdas dan efisien.
Apa itu Laravel Collection?
Collection adalah instance dari kelas Illuminate\Support\Collection. Setiap query Eloquent yang mengembalikan banyak baris akan otomatis menjadi Collection. Kamu juga bisa membuat Collection secara manual:
<?php
use Illuminate\Support\Collection;
// Dari array biasa
$collection = collect([1, 2, 3, 4, 5]);
// Dari array asosiatif
$users = collect([
['name' => 'Budi', 'age' => 25, 'city' => 'Jakarta'],
['name' => 'Ani', 'age' => 30, 'city' => 'Bandung'],
['name' => 'Caca', 'age' => 22, 'city' => 'Jakarta'],
['name' => 'Dodi', 'age' => 28, 'city' => 'Surabaya'],
]);
Method map() โ Transformasi Data
map() mengiterasi setiap item dan mengembalikan Collection baru hasil transformasi:
// Mengubah semua nama menjadi huruf besar
$upperNames = $users->map(function ($user) {
return strtoupper($user['name']);
});
// Result: ['BUDI', 'ANI', 'CACA', 'DODI']
// Dengan arrow function (PHP 7.4+)
$prices = collect([10000, 25000, 15000]);
$discounted = $prices->map(fn($price) => $price * 0.9);
// Result: [9000, 22500, 13500]
Method filter() โ Menyaring Data
filter() mengembalikan Collection yang hanya berisi item yang lulus kondisi:
// Filter user dari Jakarta
$jakartaUsers = $users->filter(fn($user) => $user['city'] === 'Jakarta');
// Result: Budi dan Caca
// Filter tanpa callback: hapus nilai falsy (null, false, 0, '')
$clean = collect([1, null, 2, false, 3, 0])->filter();
// Result: [1, 2, 3]
// Re-index setelah filter
$reindexed = $jakartaUsers->values();
Method groupBy() โ Mengelompokkan Data
groupBy() sangat berguna untuk mengelompokkan data berdasarkan key tertentu:
$byCity = $users->groupBy('city');
/*
Result:
[
'Jakarta' => [Budi, Caca],
'Bandung' => [Ani],
'Surabaya' => [Dodi],
]
*/
// Akses tiap group
$jakartaGroup = $byCity->get('Jakarta');
$jakartaGroup->count(); // 2
Method pluck() โ Mengambil Nilai Satu Kolom
// Ambil semua nama
$names = $users->pluck('name');
// Result: ['Budi', 'Ani', 'Caca', 'Dodi']
// Buat key-value pair
$nameById = User::all()->pluck('name', 'id');
// Result: [1 => 'Budi', 2 => 'Ani', ...]
// Berguna untuk dropdown select
<select name="user_id">
@foreach($nameById as $id => $name)
<option value="{{ $id }}">{{ $name }}</option>
@endforeach
</select>
Method reduce() โ Akumulasi Nilai
// Hitung total harga
$items = collect([
['name' => 'Buku', 'price' => 50000, 'qty' => 2],
['name' => 'Pensil', 'price' => 5000, 'qty' => 5],
['name' => 'Tas', 'price' => 200000, 'qty' => 1],
]);
$total = $items->reduce(function ($carry, $item) {
return $carry + ($item['price'] * $item['qty']);
}, 0);
// Result: 325000
Chaining Method โ Kekuatan Sebenarnya Collection
Keunggulan terbesar Collection adalah kemampuan method chaining yang membuat kode lebih ekspresif:
// Ambil nama user dari Jakarta, usia di atas 23, diurutkan abjad
$result = $users
->filter(fn($u) => $u['city'] === 'Jakarta')
->filter(fn($u) => $u['age'] > 23)
->sortBy('name')
->pluck('name')
->values();
// Result: ['Budi']
Method Berguna Lainnya
sum('price')โ menjumlahkan nilai dari key tertentu.avg('age')โ rata-rata nilai.max('age')/min('age')โ nilai maksimum/minimum.sortBy('name')/sortByDesc('age')โ mengurutkan data.unique('city')โ menghapus duplikat.chunk(3)โ memecah Collection menjadi potongan-potongan kecil.contains('name', 'Budi')โ cek apakah ada item yang cocok.first()/last()โ mengambil elemen pertama/terakhir.toArray()โ mengubah kembali menjadi array PHP biasa.toJson()โ mengubah menjadi string JSON.
Lazy Collection untuk Data Besar
Jika kamu perlu memproses data yang sangat besar (ratusan ribu baris), gunakan LazyCollection agar memori tetap efisien:
use Illuminate\Support\LazyCollection;
// Proses file besar baris per baris
LazyCollection::make(function () {
$handle = fopen('data.csv', 'r');
while (($line = fgets($handle)) !== false) {
yield $line;
}
})->chunk(1000)->each(function ($chunk) {
// Proses per 1000 baris
});
Kesimpulan
Laravel Collection mengubah cara kamu berpikir tentang manipulasi data. Daripada menulis loop foreach bertumpuk, gunakan method Collection yang ekspresif dan bisa di-chain. Mulai dari map(), filter(), groupBy(), hingga reduce() โ semua tersedia siap pakai. Semakin kamu familiar dengan Collection, semakin bersih dan mudah dibaca kode Laravel-mu.