1. Laravel
  2. PHP

Laravel Mass Assignment

Pada artikel kali ini kita akan membahas mengenai salah satu fitur yang memudahkan kita untuk menyimpan atau mengupdate data pada Eloquent Model yaitu Mass AssignmentMass 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.

KolomTipe Data
idbigint(20) unsigned Auto Increment
namevarchar(255)
emailvarchar(255)
created_attimestamp NULL
updated_attimestamp 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 comments
Comments to: Laravel Mass Assignment
  • February 28, 2020

    terima kasih mas. sangat bermanfaat untuk saya yang baru belajar laravel saya ingin fokus jadi full stack dev hehe

    Reply
  • March 19, 2021

    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 🙂

    Reply
    • March 25, 2021

      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

      protected $fillable = [
          'field_1',
          'field_2',
          'field_3',
          'field_4',
          'field_5',
          'field_6',
          'field_7',
          'field_8',
          'field_9',
      ];
      

      Menggunkan $guarded

      protected $guarded = [
          'field_10',
      ];
      
      Reply

Write a response

Your email address will not be published. Required fields are marked *

Attach images - Only PNG, JPG, JPEG and GIF are supported.