laravel accessor mutator | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: laravel accessor mutator

Sunday, April 12, 2026

laravel accessor mutator

Laravel Eloquent ORM PHP Artikel ke-29

Seri Belajar Laravel Lengkap · Artikel 29 dari 50

Accessors, Mutators & Casting di Eloquent

Pernah capek format tanggal atau nama berulang kali di seluruh view-mu? Saatnya belajar cara "mendidik" model Eloquent-mu untuk melakukan semua itu secara otomatis.

⏱️
Estimasi Baca
12 Menit
📊
Level
Intermediate
🗓️
Tahun
2025

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

📥 Accessor
Mengubah data saat dibaca dari model. Contoh: nama disimpan "budi santoso" → ditampilkan "Budi Santoso".
📤 Mutator
Mengubah data saat ditulis ke model. Contoh: password diketik → otomatis di-hash sebelum masuk DB.
🔄 Casting
Konversi tipe data otomatis. Contoh: kolom 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:

1
Tambahkan use statement di model
Pastikan kamu import class Illuminate\Database\Eloquent\Casts\Attribute di model kamu.
2
Buat method dengan nama atribut (camelCase)
Misalnya untuk atribut first_name, buat method bernama firstName().
3
Return instance Attribute dengan closure get
Di dalam method, return Attribute::make(get: fn($value) => ...).
app/Models/User.php
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"
💡
Tips: Snake_case saat memanggil
Method accessor kamu tulis 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().

app/Models/User.php — Mutator
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();
Insight Penting: DRY Principle dalam Aksi
Dengan accessor mutator Laravel, kamu menerapkan prinsip DRY (Don't Repeat Yourself) di level model. Logika transformasi data cukup ditulis sekali di model — controller, view, dan semua bagian lain otomatis dapat datanya dalam kondisi yang tepat.
⚠️
Perhatian: Jangan Pakai Cara Lama di Laravel 9+
Di Laravel versi lama, accessor ditulis dengan prefix 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.

app/Models/Post.php — $casts
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) { ... }
🔥
Fakta Menarik: Custom Cast!
Laravel juga mendukung Custom Cast — kamu bisa buat class cast sendiri untuk tipe data yang tidak ada bawaan, seperti konversi koordinat GPS menjadi object khusus, atau enkripsi/dekripsi data sensitif secara otomatis. Cukup buat class yang implement 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.

app/Models/Product.php — Studi Kasus Lengkap
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"
💡
Tips: Caching Accessor untuk Performa
Jika accessor kamu melakukan komputasi berat, gunakan 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.

📥
Accessor
Transformasi data saat dibaca — format sekali, dipakai di mana saja.
📤
Mutator
Sanitasi & normalisasi data otomatis sebelum masuk database.
🔄
Casting
Konversi tipe data otomatis — tidak perlu cast manual lagi!

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.

#Laravel #PHP #Eloquent #Accessor #Mutator #Casting #Tutorial #BelajarLaravel

📚 Bagian dari Seri 50 Artikel Belajar Laravel Lengkap — dari dasar sampai mahir, satu artikel tiap hari.

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux