Bayangkan kamu punya model User dan di setiap halaman kamu nulis strtoupper($user->name) biar namanya jadi kapital semua. Di 10 view. Lalu 20 view. Lalu... kamu mulai mau nangis. 😭 Nah, inilah saatnya kamu kenalan dengan accessor mutator Laravel — fitur Eloquent yang bikin modelmu bisa "otomatis" memformat, mengubah, atau menyesuaikan data tanpa kamu harus nulis logika yang sama berkali-kali. Artikel ini bagian dari Seri 50 Artikel Belajar Laravel, dan setelah baca ini, kamu bakal paham betapa elegan-nya Eloquent sebenarnya.
Formula Inti: 3 Konsep yang Wajib Kamu Kuasai
is_active di DB integer → di PHP langsung jadi boolean.🔍 Apa Itu Accessor di Laravel dan Cara Kerjanya?
Anggap model Eloquent-mu itu seperti pelayan restoran. Ketika kamu memesan (request data), pelayan tidak langsung kasih bahan mentah dari dapur — dia plating dulu, tambahin garnish, bikin tampilannya cantik. Nah, accessor mutator Laravel bekerja persis seperti itu untuk data yang kamu baca dari database.
Di Laravel 9+, cara bikin accessor sudah lebih modern menggunakan class Attribute. Begini cara pakainya:
Illuminate\Database\Eloquent\Casts\Attribute di model kamu.first_name, buat method bernama firstName().Attribute::make(get: fn($value) => ...).use Illuminate\Database\Eloquent\Casts\Attribute; class User extends Model { // Accessor: otomatis kapitalisasi nama depan protected function firstName(): Attribute { return Attribute::make( get: fn($value) => ucfirst($value), ); } // Accessor computed: gabungkan first & last name protected function fullName(): Attribute { return Attribute::make( get: fn() => "{$this->first_name} {$this->last_name}", ); } } // Di view/controller, gunakan seperti properti biasa: echo $user->full_name; // Output: "Budi Santoso"
fullName() (camelCase), tapi saat dipanggil dari luar gunakan snake_case: $user->full_name. Eloquent otomatis konversi untuk kamu!✍️ Cara Kerja Mutator di Laravel: Jaga Data Sebelum Masuk Database
Kalau accessor itu "pelayan yang menyajikan makanan dengan cantik", maka mutator adalah "chef yang memproses bahan baku sebelum dimasak". Setiap kali kamu set nilai ke properti model — misalnya $user->password = 'rahasia123' — mutator bisa mencegat nilai itu dan mengolahnya sebelum masuk ke database.
Mutator didefinisikan di method yang sama dengan accessor — bedanya, kamu mengisi parameter set pada Attribute::make().
class User extends Model { // Mutator: hash password otomatis sebelum disimpan protected function password(): Attribute { return Attribute::make( set: fn($value) => bcrypt($value), ); } // Accessor + Mutator dalam 1 method (nama selalu lowercase) protected function email(): Attribute { return Attribute::make( get: fn($value) => strtolower($value), set: fn($value) => strtolower($value), ); } } // Penggunaan — otomatis di-hash, tidak perlu bcrypt() manual: $user->password = 'rahasia123'; // tersimpan sebagai hash di DB $user->save();
get[Nama]Attribute() dan mutator dengan set[Nama]Attribute(). Cara ini masih berfungsi di Laravel 9+, tapi cara baru dengan class Attribute lebih ekspresif dan direkomendasikan untuk project baru.🔄 Attribute Casting: Konversi Tipe Data Otomatis yang Sering Dilupakan
Ini adalah fitur paling simpel tapi paling sering diabaikan pemula. Database itu tidak mengenal tipe data PHP — semua dari MySQL datang sebagai string. Kolom is_active yang nilainya 1 di database, ketika kamu cek dengan $user->is_active === true bisa error karena itu string "1", bukan boolean true.
Dengan casting, kamu cukup deklarasikan di properti $casts dan Eloquent otomatis konversi tipe data untuk kamu.
class Post extends Model { protected $casts = [ 'is_published' => 'boolean', // string "1" → true/false 'published_at' => 'datetime', // string → Carbon instance 'view_count' => 'integer', // string → integer 'metadata' => 'array', // JSON string → PHP array 'rating' => 'decimal:2', // presisi 2 angka desimal ]; } // Sekarang bisa dipakai langsung: if ($post->is_published) { // Ini boolean beneran! echo $post->published_at->diffForHumans(); // Carbon magic! } // metadata otomatis jadi array: foreach ($post->metadata as $key => $value) { ... }
CastsAttributes!Perbandingan: Accessor vs Mutator vs Casting
| Fitur | Kapan Dijalankan | Cocok Untuk | Kompleksitas |
|---|---|---|---|
| Accessor | Saat data dibaca dari model | Format tampilan, computed property | Rendah–Menengah |
| Mutator | Saat data ditulis ke model | Sanitasi, hashing, normalisasi | Menengah |
| Casting | Otomatis saat akses | Konversi tipe data sederhana | Sangat Rendah |
| Custom Cast | Baca & tulis, bisa dikonfigurasi | Logika transformasi kompleks & reusable | Tinggi |
🚀 Studi Kasus: Menerapkan Accessor Mutator Laravel di Proyek Nyata
Mari kita lihat contoh kasus konkret — model Product untuk toko online. Kita ingin harga tersimpan dalam satuan sen (integer) di database untuk menghindari masalah floating point, tapi ditampilkan dalam format rupiah yang rapi.
class Product extends Model { protected $casts = [ 'is_active' => 'boolean', 'tags' => 'array', 'created_at' => 'datetime', ]; // ACCESSOR: Format harga Rupiah dari nilai sen protected function price(): Attribute { return Attribute::make( get: fn($value) => 'Rp ' . number_format($value / 100, 0, ',', '.'), set: fn($value) => (int) ($value * 100), // Simpan dalam sen ); } // ACCESSOR: Slug otomatis dari nama produk protected function slug(): Attribute { return Attribute::make( get: fn($value) => $value ?? Str::slug($this->name), ); } } // Penggunaan yang bersih di controller/view: $product->price = 150000; // Tersimpan sebagai 15000000 (sen) echo $product->price; // Output: "Rp 150.000" echo $product->slug; // Output: "nama-produk-keren"
Attribute::make(...)->shouldCache(). Ini bikin nilai accessor dihitung sekali dan di-cache selama lifecycle model tersebut, sehingga tidak dihitung ulang setiap kali dipanggil.Kesimpulan: Model Eloquent yang Lebih Cerdas
Setelah artikel ini, kamu sudah punya senjata baru untuk membuat kode Laravel yang lebih bersih dan maintainable.
Dengan menguasai accessor mutator Laravel dan casting, kamu sedang membangun fondasi model yang solid — tempat semua logika transformasi data terpusat, bukan tersebar di mana-mana. Ini adalah langkah penting menuju arsitektur Laravel yang profesional, sesuai yang kita bahas di seluruh 50 Artikel Seri Belajar Laravel ini.
📚 Bagian dari Seri 50 Artikel Belajar Laravel Lengkap — dari dasar sampai mahir, satu artikel tiap hari.
No comments:
Post a Comment