Kapan Menggunakan Magic Property $appends di Laravel?

Dalam Eloquent, terdapat sebuah magic property dengan nama $appends. Seringkali, bagi developer yang baru menggunakan Laravel kebingungan kapan harus menggunakan properti tersebut.

Ada beberapa yang cukup tau fungsinya, yaitu menambahkan attribute baru pada model. Tapi, attribute yang seperti yang dapat ditambahkan?


Mari kita buat contoh sederhana, dalam tabel users terdapat dua buah kolom dengan nama first_name dan last_name . Untuk mendapatkan nama lengkap data tersebut, kita bisa saja menggabungkannya dengan concatenation.

$user = User::first();
echo $user->first_name . $user->last_name;
echo sprintf('%s %s', $user->first_name, $user->last_name);

Tidak ada yang salah dengan potongan skrip di atas. Yang menyebalkan adalah ketika kita harus melakukannya berulang-ulang pada aplikasi — khususnya view — . Apalagi sampai ada perubahan format, semisal namanya dibalik, nama belakang ditaruh pada bagian depan. Lebih repot lagi bukan menggantinya satu persatu?

Accessor

Sebelum beranjak ke properti $appends , mari berkenalan dahulu dengan salah satu fitur yang ada pada Eloquent, Accessor. Fitur ini berfungsi mengubah format data kembalian Eloquent. Dari Accessor inilah nantinya kita bisa menambahkan attribute baru pada Model.

Sedikit membahas saudara Accessor, yaitu Mutator.
Jika Mutator berfungsi untuk memformat data sebelum disimpan ke pangkalan data, maka Accessor berfungsi untuk memformat data yang sudah dibaca dan bersumber dari pangkalan data.

Berdasarkan contoh kasus di atas, kita ingin menggabungkan attribute first_name dan last_name.

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

Perhatikan aturan penulisannya. Accessor harus dimulai dari kata get dan diakhiri dengan kata Attribute. Di antaranya, disisipkan nama attribute yang akan dibuat dan ditulis dalam format camelCase. Semisal, jika ingin menambahkan attribute full_name , maka nama method-nya ditulis dalam bentuk getFullNameAttribute() .

Menggunakan $appends

Accessor sudah dibuat, namun belum bisa digunakan sepenuhnya sebelum kita menambahkan attribute tersebut pada property $appends. Caranya sederhanya, cukup mendefinisikan protected property dengan tipe array pada model (model user sebagai contoh).

protected $appends = [
'name'
];

Ingat rumusnya, jika pada method Accessor ditulis dalam bentuk camelCase, maka dalam properti $appends ditulis dalam bentuk snake_case.

Contoh implementasi dapat dilihat pada potongan skrip di bawah.

$user = User::first();
$user->first_name;
$user->last_name;
$user->name;

Apabila kita melakukan debugging menggunakan fungsi dd($user) , attribute name tersebut tidak nampak. Hal ini dikarenakan attribute tersebut bersifat virtual, tak sepenuhnya ada pada kolom pangkalan data.