Berkenalan dengan Magic Property (Properti) Eloquent


Pernahkah kalian membuka berkas model Laravel yang berbasis Eloquent? Jika iya, tak sedikit dari kita yang dibuat bingung karena tidak ada sama sekali properti yang didefinisikan di dalamnya. Seolah, model tersebut paham betul nama tabel atau primary key yang digunakan.

Di lain sisi, kita juga kadang dibuat bingung karena ada banyaknya properti yang didefinisikan pada suatu model. Memang sih, namanya cukup mudah dipahami. Namun, tetap saja kita harus mencari-cari di dokumentasi Laravel untuk memahami fungsi sebenarnya.

Pada dokumentasi Laravel sendiri, bahasan ini masuk dalam kategori khusus dengan nama Eloquent mutator. Tak hanya properti yang dijabarkan, ada juga beberapa (magic) method yang dijelaskan.

Biar tidak bingung, mari kita berkenalan satu persatu dengan properti yang ada di Eloquent. Semakin kita paham fungsi masing-masing properti, semakin meningkat produktivitas kita dalam memanipulasi data.

Hampir semua properti di bawah didefinisikan dengan visibility protected. Sebagai contoh protected $property = []. Selengkapnya mengenai visibility dalam OOP dapat dibaca pada dokumentasi PHP berikut.

$table

Jika kita mengikuti naming convention dari Laravel, umumnya properti ini tidak perlu didefinisikan. Sebagai contoh, kita punya model dengan nama class User (tunggal/singular), maka Eloquent menganggap nama tabelnya adalah users (jamak/plural).

Properti $table digunakan ketika penamaan tabel yang akan digunakan tidak sesuai dengan aturan baku di Eloquent.

Sebagai contoh, jika kita punya tabel dengan nama halaman, maka sintaksnya bisa dibuat seperti berikut.

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

class Page extends Model
{
    /**
    * Set default table name
    * @type {String}
    */
    protected $table = 'halaman';
}

$primaryKey

Eloquent akan menganggap atribut id dalam tabel sebagai primary key dan mengkonversinya (cast) menjadi tipe data integer. Jika selain itu, gunakan properti $primaryKey untuk menjelaskan kepada Eloquent kalau kita menggunakan nama atribut yang lain.

/**
 * Set default primary key
 * @type {String}
 */
protected $primary = 'user_id';

$fillable

Properti yang satu ini punya fungsi untuk mendaftarkan atribut apa saja yang sekiranya dapat disimpan atau dimanipulasi menggunakan create() atau insert().

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
 'name',
 'email',
 'gender'
];

Contoh penyimpanan data menggunakan create().

Baca juga 5 Cara Menyisipkan Data (Insert Row) dengan Eloquent.

\App\User::create([
    'name'      => $faker->name,
    'email'     => $faker->email,
    'birthdate' => $faker->date,
    'gender'    => $faker->sex,
]);

Properti $fillable juga sangat berguna ketika ingin melakukan mass assignment, atau dengan bahasa lebih sederhananya, menyimpan banyak data dalam satu perintah atau dalam bahasa Inggris disebut batch insert (sisipan tumpak). Sebagai contoh:

$users = [];
foreach (range(1, 10) as $loop) {
    $users[] = [
        'name'  => $faker->name,
        'email' => $faker->email,
    ];
}
User::insert($users);

$guarded

Merupakan properti kebalikan dari $fillable. Secara bawaan, nilainya adalah [*] yang berarti berlaku untuk semua atribut. Itulah kenapa, jika $fillable tidak didefinisikan, maka akan menyebabkan kegagalan dengan pesan kesalahan seperti ini.

MassAssignmentException in Model.php line 421: field

Dengan mendefinisikan $guarded, maka Eloquent akan mengabaikan atribut tersebut pada mass assignment.

/**
 * The attributes that are guarded from mass assignable
 *
 * @var array
 */
protected $guarded = [
 'gender'
];

$dates

Jika terbiasa menggunakan migration di Laravel, pasti tidak asing dengan dua atribut ajaib dengan nama created_at dan updated_at. Nilainya sendiri berupa DateTime MySQL.

Ketika digunakan dalam aplikasi, dua atribut tersebut merupakan objek dari class Carbon. Memungkinkan kita untuk menggunakan method yang ada pada Carbon, semisal:

$user->created_at->format('d-m-Y H:i');
$user->updated_at->diffForHumans();
$user->register_at()->addDays(3);

Bagaimana jika kita punya atribut serupa, dengan nama lain tapi isian sama? Nah, kita bisa mendaftarkannya menggunakan properti $dates.

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $dates = [
 'registered_at'
];

Baca juga Mengubah Format Tanggal di Laravel.

$timestamps

Masih berhubungan dengan properti $dates di atas, di mana atribut created_at dan updated_at otomatis akan selalu diisi pada saat penyimpanan maupun pembaruan data (hanya created_at) walaupun kita tidak mendefinisikannya.

Jika dalam tabel kita tidak ingin ada dua atribut tersebut, atau ingin mengisinya secara manual, maka dapat menggunakan properti $timestamps. Yang perlu diingat, khusus untuk properti ini menggunakan visibilitypublic, berbeda dengan properti lain yang menggunakan visibility protected.

/**
 * Disable timestamps format
 * @type {Boolean}
 */
public $timetamps = false;

$casts

Saya sedikit kebingungan mencari padanan yang tepat dalam Bahasa Indonesia untuk kata cast. Satu-satunya yang cukup dimengerti adalah konversi.

Mari simak contoh data berikut:

{
 name: "Laravel Indonesia",
 rate: "10",
 average: "7.8",
 is_published: "1"
}

Saya punya atribut dengan nama is_published dengan tipe data TinyInteger(1) pada MySQL. Secara bawaan, Eloquent selalu mengembalikannya dalam bentuk string.

Dalam PHP, hal ini tidak menjadi masalah ketika di-compare dengan ($user->is_published == $value) (nilai harus sama), namun menjadi masalah ketika di-compare menggunakan ($user->is_published === $value) (nilai dan tipe data harus sama). Lebih bermasalah lagi ketika digunakan oleh bahasa pemrograman lain, seperti JavaScript misalnya. Karena string “1” dan “0” akan dianggap true.

Hal yang sama juga terjadi pada atribut rate dan average, di mana saya ingin menjadikan nilai rate sebagai integer dan average sebagai float.

/**
 * Cast fields into different type
 * @type {Array}
 */
$casts = [
    'rate'         => 'integer',
    'average'      => 'float',
    'is_published' => 'boolean',
];

Konversi yang didukung antara lain: integer, real, float, double, string, boolean, object, array, collection, date, datetime, dan timetamp.

$hidden

Dengan properti ini, memungkinkan untuk hanya menampilkan beberapa atribut. Sebagai contoh:

protected $hidden = [
 'password',
 'remember_token',
 'hash_method'
];

Properti ini sangat berguna untuk menghindari “kecelakaan” saat menampilkan kembalian data collection dari model. Sebagai contoh, kita punya atribut name, password, dan remember_token.

return User::first();
{
 "nama": "Laravel Indonesia"
}

$visible

Kebalikan dari properti $hidden di mana akan menampilkan atribut yang didefinisikan.

protected $visible = [
 'name',
 'remember_token'
];

Jika nilainya diisi, maka hanya menampilkan atribut yang telah didefinisikan pada $visible dan mengabaikan properti $hidden. Jadi, cukup satu saja yang perlu didefinisikan. Dan perlu diingat, $visible lebih tinggi prioritasnya dibandingkan $hidden.

$appends

Menambahkan atribut baru berdasarkan atribut lainnya. Tak harus selalu berbasis atribut lainnya, dalam property $appends juga bisa menggunakan data statis.

protected $appends = ['full_name'];

Properti $appends hanya dapat digunakan bersamaan dengan Accessor pada Eloquent. Agar skrip di atas dapat digunakan, kita harus membuat sebuah method baru dengan getFullNameAttribute().

public function getNameAttribute()
{
    return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
}
Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan