Pada artikel kali ini kita akan membahas mengenai salah satu fitur yang memudahkan kita untuk menyimpan atau mengupdate data pada Eloquent Model yaitu Mass Assignment. Mass Assignment pada Laravel memungkinkan kita untuk mengirimkan data dalam bentuk array dengan array_keys
adalah kolom yang digunakan pada database.
Sebelum membahas mengenai Mass Assignment pada Laravel ini, mari kita bahas terlebih dahulu bagaimana cara menyimpan data menggunakan Eloquent Model agar kita bisa mengetahui perbedaannya. Sebagai contoh, diasumsikan kita memiliki sebuah table users dengan skema seperti ini.
Kolom | Tipe Data |
---|---|
id | bigint(20) unsigned Auto Increment |
name | varchar(255) |
varchar(255) | |
created_at | timestamp NULL |
updated_at | timestamp NULL |
Untuk menyimpan data dengan contoh skema diatas, kita bisa menggunakan kode kurang lebih seperti ini.
$user = new User(); $user->name = 'Alfa Adhitya'; $user->email = 'email@domain.com'; $user->save();
Laravel Mass Assignment
Ketika menginisialisasi sebuah model, kita bisa mengirimkan attribute-attribute dalam bentuk array pada model constructor. Attribute-attribute ini nantinya akan di assign ke model. Proses inilah yang disebut sebagai Mass Assignment.
Berikut ini adalah contoh bagaimana menyimpan data menggunakan Mass Assignment.
$user = new User([ 'name' => 'Alfa Adhitya', 'email' => 'email@domain.com' ]); $user->save();
Selain menggunakan kode seperti diatas, kita juga bisa mempersingkat proses diatas dengan menggunakan method create
dari Laravel.
User::create([ 'name' => 'Alfa Adhitya', 'email' => 'email@domain.com' ]);
Agar bisa menggunakan fitur Mass Assignment, kita perlu mengatur property $fillable
atau $guarded
pada model. Property $fillable
digunakan untuk mendefinisikan attribute mana saja yang diizinkan untuk di assign menggunakan Mass Assignment, sementara property $guarded
untuk mendefinisikan attribute mana saja yang tidak diizinkan untuk di assign menggunakan Mass Assignment.
namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', ]; // }
Fillable vs Guarded
Lalu, kapan menggunakan $fillable
dan kapan menggunakan $guarded
? Pemilihan property ini tergantung pada jumlah kolom yang ada pada table, jika kita hanya memiliki sedikit kolom pada table, kita bisa menggunakan $fillable
.
Jika kita memiliki banyak kolom pada table, kita harus lebih cermat dalam memilih kedua property ini. Gunakan property $fillable
jika jumlah kolom yang diizinkan untuk di assign menggunakan Mass Assignment lebih sedikit dibandingkan dengan yang tidak diizinkan. Sebaliknya gunakan property $guarded
jika jumlah kolom yang diizinkan untuk di assign menggunakan Mass Assignment lebih banyak.
Sebagai contoh, kita memiliki sebuah table dengan 15 kolom, 12 diantaranya diizinkan untuk di assign menggunakan Mass Assignment. Pada kasus ini, karena jumlah kolom yang diizinkan untuk di assign menggunakan Mass Assignment lebih banyak dari yang tidak diizinkan, kita bisa menggunakan property $guarded
untuk kasus ini.
class User extends Model { protected $guarded = [ 'field_13', 'field_14', 'field_15', ]; // }
Bayangkan jika kita menggunakan property $fillable
untuk kasus diatas. Akan sangat banyak attribute yang harus kita definisikan disini.
class User extends Model { protected $fillable = [ 'field_1', 'field_2', 'field_3', // // 'field_12' ]; // }
Keuntungan Mass Assignment
Lalu, apa keuntungan menggunakan Mass Assignment, perbandingan menggunakan Mass Assignment dengan tanpa Mass Assignment pada contoh diatas tidak terlihat menonjol. Jumlah Baris kode yang digunakan pun tidak terlampau jauh berbeda.
Memang kode diatas tidak terlihat memiliki perbedaan yang signifikan, tapi bayangkan jika kita menggunakan Form HTML untuk mengisi data pada database dan kita memiliki sebuah table yang memiliki banyak kolom, tentu akan sangat tidak efisien jika kita harus meng-assign attribute tersebut satu per satu.
Sekarang mari kita lihat perbedaan keduanya ketika kita menyimpan data melalui Form HTML.
Dibawah ini merupakan contoh cara menyimpan data dari Form HTML tanpa menggunakan Mass Assignment.
public function store(Request $request) { $user = new User(); $user->name = $request->input('name'); $user->email = $request->input('email'); $user->field_1 = $request->input('field_1'); $user->field_2 = $request->input('field_2'); $user->field_3 = $request->input('field_2'); // // $user->save(); // }
Dengan menggunakan Mass Assignment, proses menyimpan data akan terlihat seperti ini.
public function store(Request $request) { User::create($request->all()); }
Lebih singkat bukan? Akan tetapi dibalik semua kemudahan dengan mengimplementasikan Mass Assignment, ternyata Mass assignment memiliki masalah serius terkait keamanan. Artikel dibawah ini akan membahas permasalahan keamanan pada penerapan Mass Assignment.
People reacted to this story.
Show comments Hide commentsterima kasih mas. sangat bermanfaat untuk saya yang baru belajar laravel saya ingin fokus jadi full stack dev hehe
Ini saya salah baca atau kaga ya,di paragraf terakhir point \”Laravel Mass Assignment \”dibilang $guarded itu digunakan untuk mendefinisikan yang tidak diizinkan untuk di assign.
Tapi di point \”Fillable vs Guarded\”,disitu dibilang gunakan $guarded jika kolom yg diizinkan untuk di asign banyak.
Menurut saya 2 point ini berbeda,atau saya salah paham,mohon dijelaskan 🙂
gunakan $guarded jika kolom yg diizinkan untuk di asign banyak. Contohnya kita memiliki 10 kolom pada database, yang boleh di assign kolom 1 sampai 9. Di bandingkan menggunakan $fillable, untuk kasus ini kita bisa menggunakan properted $guarded.
Dengan kasus diatas, menggunakan $fillable kita perlu menuliskan kolom 1 sampai 9. Sementara dengan $guarded kita hanya perlu mendefinisikan kolom 10.
Menggunakan $fillable
Menggunkan $guarded