Model

 

Model

Sebelum memulai bab ini, pastikan kamu sudah melakukan latihan praktik pada bab database. Jika belum, silahkan lakukan sekarang lalu kembali lagi.

Pada latihan praktik di bab sebelumnya kita belajar membuat tabel baru dan strukturnya dengan migration. Lalu kita mengisi 10 data awal ke tabel categories. Pada latihan tersebut kita telah belajar membuat model, dan di bab ini kita akan melihat lebih jauh tentang model dan konfigurasi apa saja yang bisa kita ubah.

Kami berharap kamu masih ingat bagaimana mudahnya membuat model dengan perintah php artisan make:model Nama. Misalnya dengan perintah php artisan make:model Category dan lalu akan tergenerate sebuah file model pada path app/Category.php. Coba kamu buka file tersebut, maka kamu akan melihat sebuah file Model default. Seperti ini:

12345678910<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    //
}

Dengan model Category kita telah bisa menginsert 10 data awal. Dan hal itu kita lakukan di file CategoryTableSeeder, salah satu penggunaannya untuk membuat data kategori baru adalah seperti ini:

123$kategori = new Category; 
$kategori->name = "Sepatu";
$kategori->save();

Penjelasan Kode: Membuat model Category dengan perintah new Category disimpan sebagai variabel $kategori lalu kita ubah field name menjadi "Sepatu" dan kita simpan ke database dengan perintah $kategori->save()

Sampai di situ kamu sekarang paham apa kegunaan model, bukan? Mulai semakin terlihat jelas?

Selain di file Seeder seperti yang telah kita lakukan di latihan praktik, kita juga akan banyak menggunakan Model pada controller. Yup, betul ini sejalan dengan visualisasi arsitektur MVC yang telah kita lihat di bab arsitektur Laravel.

Konvensi Model

Konvensi penamaan model adalah hufuf pertama menggunakan kapital misalnya, CategoryProductUser dan jika terdiri dari dua kata maka ditulis seperti ini ProductList. Lebih baik jika sebuah model cukup menggunakan satu kata.

Konvensi berikutnya adalah setiap nama tabel akan merepresentasikan nama tabel di database dengan nama jamak. Misalnya model Category secara otomatis merepresentasikan tabel categories, model User otomatis merepresentasikan tabel users. Perhatikan ya bentuk jamak nama tabel di database.

Bagaimana jika kita ingin menggunakan nama tabel yang berbeda dari kesepakatan? Setelah ini kita akan membahas properti apa saja yang bisa kita gunakan untuk mengubah model kita.

Model Attribute / properti

Mengganti Tabel pada Model

Kita bisa melakukannya dengan menambahkan properti protected $table pada file model kita seperti berikut:

12345678910<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   protected $table = “custom_nama_table”;
}

Dengan definisi di atas, maka sekarang model Category merepresentasikan tabel custom_nama_table di database.

Menggunakan Koneksi Selain Default pada Model

Koneksi untuk sebuah model secara default menggunakan settingan global di file konfigurasi database kita. Akan tetapi, misalnya untuk model tertentu kita ingin menggunakan koneksi selain default, maka kita gunakan properti $connection pada model tersebut untuk menentukan koneksi mana yang ingin dipakai di model yang bersangkutan.

1234567891011<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   protected $table = "custom_nama_table";
   protected $connection = “mongo_stage_1”;
}

Apabila settingan default koneksi di aplikasi laravel kita menggunakan settingan bernama “mysql_production”, maka dengan kode di atas, khusus untuk model Product akan menggunakan “mongo_stage_1” bukan “mysql_production”.

Mengubah Primary Key Model

Ketika kita membuat model baru, maka secara default dianggap tabel dari model tersebut memiliki primary key dengan field id. Melanjutkan ilustrasi sebelumnya, bila kita ingin mengubah field primaryKey untuk model Product kita gunakan properti $primaryKey seperti ini

1234567891011<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   protected $table = "custom_nama_tabel";
   protected $primaryKey = “identifier”;
}

Dengan kode di atas, maka sekarang model Product menggunakan field identifier pada tabel custom_nama_tabel sebagai primaryKey.

Mass-assignment

Apa itu mass-assignment? dan kenapa penting? Mass-assignment merupakan cara untuk menginsert data melalui model dengan sekali perintah. Misalnya seperti ini:

1$kategori = Category::create($request->all());

Perhatikan kita menginsert langsung ke tabel categories menggunakan model Category method create dan mengisikan seluruh data yang kita ambil dari $request->all() (telah kita pelajari di bab route & controller)

Bukankah cara ini berbeda dengan yang telah kita praktikan pada latihan sebelumnya yaitu dengan kode ini

123$kategori = new Category; 
$kategori->name = "Sepatu";
$kategori->save();

Cara yang ini memang agak bertele-tele karena kita mengassign nilai ke setiap field satu per satu, bayangkan jika ada banyak field? Bukankah lebih cepat dengan mass-assignment? Yaitu menggunakan NamaModel::create($data)

Ya, memang lebih cepat dengan mass-assignment, akan tetapi kita harus mempertimbangkan faktor keamanan. Kenapa begitu? karena dengan mass-assignment kita membuka celah bagi user untuk mengakali aplikasi kita.

Misalnya begini, kita punya model User yang merepresentasikan tabel users di database. Tabel users memiliki field antara lain nameemailaddress dan role. Field role akan diisi dengan customer atau administrator. Bayangkan jika kita menggunakan mass-assignment, maka orang yang tidak bertanggung jawab bisa menginject ke form untuk melakukan update terhadap akun dirinya agar menjadi admin, dia cukup menambahkan field role pada form diisi dengan nilai administrator.

Di kode kita, kita menggunakan mass-assignment seperti ini:

1$user = User::create($request->all());

Siapa yang tahu ternyata $request->all() berisi data tambahan yaitu role bernilai administrator, padahal field tersebut seharusnya defaultnya adalah customer.

Nah untuk mencegah hal tersebut kita harus memberikan nilai ke field role pada kode kita seperti ini:

12$user->role = "CUSTOMER";
$user->save();

Cara ini akan mencegah kerentanan yang telah dijelaskan tadi. Oleh karena itu secara default Laravel model memproteksi seluruh field dari operasi mass-assignment. Akan tetap mass-assignment ini sebetulnya sangat membantu mempercepat kita sebagai developer tanpa harus satu per satu memberi nilai ke tiap-tiap field. Yup, mass-assignment boleh dilakukan, terutama untuk data-data yang bukan bersifat sensitif dan krusial.

Dan Laravel pun mengizinkan hal ini, maka dari itu kita bisa melakukan konfigurasi pada model field mana saja yang boleh untuk dilakukan mass-assignment dan field mana saja yang diproteksi dari operasi tersebut.

Mengizinkan Operasi Mass-assignment pada Properti Model

Properti $fillable kita gunakan untuk mengizinkan fields-fields apa saja yang diperbolehkan untuk operasi mass assignment. Properti ini harus diassignkan dengan nilai array yang berisi nama field yang diperbolehkan untuk mass assignment. Misalnya dari model User tadi kita ingin mengizinkan properti emailname dan address tapi membiarkan field role terlindungi, maka kita tambahkan properti $fillable di model User seperti ini:

123456789101112<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   protected $table = "custom_nama_table";
   protected $primaryKey = “identifier”;
   protected $fillable = ["name", "email", "address"];
}

Dengan kode di atas, kini fields nameemail, dan address diperbolehkan untuk operasi mass-assignment, sementara field role tidak diizinkan.

Memproteksi Properti Model dari Operasi Mass-assignment

properti $guards memiliki fungsi sebaliknya dengan $fillable, yaitu untuk mendeklarasikan field apa saja yang tidak diperbolehkan untuk mass-assignment. Contohnya adalah seperti ini

123456789101112<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
   protected $table = "custom_nama_table";
   protected $primaryKey = "identifier";
   protected $guards = ["role"];
}

Dengan kode di atas, maka kini kita mengizinkan semua field pada model User untuk operasi mass-assignment, kecuali yang dilindungi (guarded) yaitu field role.

Mencatat Kapan Data Model Dibuat dan Diupdate

Secara default model mengasumsikan tabel kita memiliki field created_at dan updated_at. Kedua field tersebut merupakan penanda kapan suatu record tersebut dibuat dan kapan terakhir diupdate. Keduanya akan otomatis diinsert atau diupdate ketika kita memanipulasi record menggunakan Eloquent.

Jika tabel kita tidak memiliki kedua field tersebut akan muncul error. Untuk menghindari error bila kita memang tidak memerlukan field created_at dan updated_at, maka kita set properti $timestamps ke false seperti ini:

1234567891011<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   //
   protected $timestamps = false;
}

Selanjutnya, misalnya kita ingin menggunakan timestamps tapi menggunakan field lain kita bisa ubah dengan const CREATED_AT dan UPDATED_AT seperti ini:

1234567891011<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   const CREATED_AT = “tanggal_dibuat”;
   const UPDATED_AT = “tanggal_diupdate”;
}

Komentar

Postingan populer dari blog ini

Puisi : Kerendahan Hati

Apa itu BMR, NEAT, EAT, TEF dan TDEE?

Kecerdasan: Dari Data Hingga Kebijaksanaan