Anda di halaman 1dari 26

Migration

13. Migration

Pengaksesan database menjadi salah satu fitur terpenting dari setiap web application. Dan
konsep MVC sendiri sudah mengakomodasi komponen bernama Model untuk memprosesnya.

Laravel menyediakan cukup banyak fitur pengelolaan database seperti migration, DB facade,
query builder, serta eloquent. Materi inilah yang membentuk Model di Laravel. Dalam bab ini
kita akan bahasa tentang migration terlebih dahulu. Namun sebelum itu mari lihat sejenak
terkait pengaturan serta konfigurasi database.

13.1. Pengaturan Database Laravel


Sebagaimana yang sudah kita pahami, database merupakan aplikasi yang terpisah dari PHP.
Aplikasi database ini juga banyak jenis-jenisnya. Untuk aplikasi web berbasis PHP, yang paling
sering dipakai adalah MySQL/MariaDB, SQLite, PostgreSQL serta SQL Server.

Keempat jenis database ini sudah didukung Laravel secara bawaan. Jika anda menggunakan
aplikasi database lain, kemungkinan besar tetap bisa hanya saja butuh konfigurasi lebih lanjut.

Dalam buku ini kita akan memakai database MySQL (atau tepatnya MariaDB) bawaan XAMPP.
Agar bisa berkomunikasi dengan MySQL, perlu mengatur beberapa konfigurasi Laravel.

File Konfigurasi .env dan config\database.php


Ketika membahas bab Error Display & Proses Debugging, kita sudah pelajari bahwa Laravel
punya 2 lokasi pengaturan: konfigurasi lokal di file .env dan pengaturan global di folder config.

Kita akan mulai dari file .env terlebih dahulu. Silahkan buka file ini dan cari baris berikut:

Gambar: Pengaturan database di file .env

314
Migration

Terdapat 6 baris pengaturan terkait database:

 DB_CONNECTION: Meskipun secara bawaan berisi 'mysql', ini bukanlah pengaturan


tentang jenis database, tapi lebih ke profile yang berisi kumpulan konfigurasi yang ada
di file config/database.php (kita akan lihat sesaat lagi). Namun memang secara bawaan
profile 'mysql' berisi konfigurasi ke database MySQL.

Nilai lain yang bisa diisi adalah 'sqlite', 'pgsql' dan 'sqlsrv', yang merujuk ke jenis
database SQLite, PostgreSQL dan SQL Server.

 DB_HOST: Dipakai untuk mengatur alamat server database. Secara bawaan sudah
berisi 127.0.0.1, yakni alamat localhost.

 DB_PORT: Dipakai untuk mengatur port dari aplikasi server database. Secara bawaan
berisi angka 3306, yakni port default bawaan MySQL.

 DB_DATABASE: Nama database yang akan dipakai. Secara bawaan sudah berisi
'laravel', yang artinya Laravel akan langsung mencari sebuah database bernama
'laravel'.

 DB_USERNAME dan DB_PASSWORD: Dipakai untuk membuat nama user dan


password login ke database server. Secara bawaan nama user adalah root, dan
password tidak diisi.

Selain DB_DATABASE, pengaturan lain sudah sesuai dengan konfigurasi MySQL bawaan XAMPP
sehingga tidak perlu kita atur lebih lanjut. Namun jika anda mengubah konfigurasi di MySQL
Server, bisa input dengan nilai yang sesuai.

Jika anda menginstall laravel melalui laravel installer, yakni dari perintah laravel new
<nama_folder>, maka pengaturan DB_DATABASE akan berisi <nama_folder>.

Misalnya jika mengetik laravel new laravel01, maka dalam file .env akan berisi
DB_DATABASE=laravel01. Namun jika menginstall laravel dari perintah composer create-
project..., pengaturan .env akan berisi DB_DATABASE=laravel.

Pengaturan default ini bisa berubah setiap saat, yang terpenting pengaturan DB_DATABASE
harus diisi dengan nama database yang ada di MySQL.

Sekarang mari kita lihat file konfigurasi kedua, yakni di config\database.php:

315
Migration

Gambar: Pengaturan database di file config\database.php

Pengaturan di file ini cukup panjang karena disertai cukup banyak baris komentar. Kita tidak
akan bahas semuanya, hanya yang dirasa penting saja.

Pertama, di awal terdapat pengaturan berikut:

'default' => env('DB_CONNECTION', 'mysql'),

Ini adalah pengaturan profile default yang akan dipakai. Kita juga pernah bahas bahwa helper
function env() berguna untuk mengambil nilai konfigurasi yang ada di file .env. Jika di file
.env tidak ditemukan konfigurasi DB_CONNECTION, maka secara default akan diisi nilai 'mysql'.

Profile 'mysql' ini merujuk ke pengaturan lanjutan yang ada di bagian 'connection':

Gambar: Pengaturan profile database di file config\database.php

Maksudnya, ketika nilai 'mysql' di isi ke dalam pengaturan DB_CONNECTION di file .env, profile

316
Migration

konfigurasi 'mysql' inilah yang dipakai. Terdapat cukup banyak pengaturan yang bisa ubah,
termasuk pilihan charset, collation, engine, dll.

Selain itu tersedia 4 profile untuk database lain, yakni ' sqlite', 'pgsql' dan 'sqlsrv'. Setiap
profile ini bisa diatur lebih lanjut, dan untuk menggunakannya cukup ganti pengaturan
DB_CONNECTION di file .env.

Jika anda bingung dengan banyaknya pengaturan yang ada, tidak perlu khawatir, karena apa
yang ada di file .env sudah mencukupi untuk keperluan kita. File config\database.php ini
lebih ditujukan untuk pengaturan yang lebih detail.

Dalam versi Laravel 9 yang saya gunakan, secara default pengaturan database di file .env
adalah sebagai berikut:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Semua pengaturan ini sudah sesuai dengan MySQL bawaan XAMPP. Yang kurang hanyalah
database 'laravel', yang akan kita buat sesaat lagi.

Jalankan Apache dan MySQL dari XAMPP


Kita bisa saja menggunakan aplikasi MySQL atau MariaDB yang diinstall terpisah, tapi akan
lebih praktis menggunakan XAMPP karena semuanya sudah tersedia, termasuk phpMyAdmin.

Silahkan buka XAMPP Control Panel dan jalankan Apache web server dan MySQL server.

Gambar: Tampilan XAMPP Control Panel

Untuk membuat database, bisa dari cmd MySQL Client atau dari phpMyAdmin. Agar lebih

317
Migration

praktis, saya akan pakai phpMyAdmin. Silahkan buka web browser dan ketik alamat
http://localhost/phpmyadmin .

Kemudian klik menu Database (1), ketik 'laravel' di inputan Database name (2), lalu klik tombol
Create (3).

Gambar: Buat database 'laravel' dari phpMyAdmin

Jika tidak masalah, di sisi kiri akan tampil database laravel.

Gambar: Database 'laravel' berhasil dibuat

Persiapan kita sudah selesai, saatnya membahas Laravel Migration.

Nama database sebenarnya boleh suka-suka, tidak harus ' laravel'. Kita bisa saja
membuat database 'belajar' atau 'universitas', kemudian input nama database ini ke
dalam pengaturan DB_DATABASE di file .env.

13.2. Pengertian Migration


Secara sederhana, migration adalah fitur Laravel untuk men-generate tabel dengan cepat.

318
Migration

Hanya dengan 1 perintah php artisan, satu hingga puluhan tabel bisa langsung tersedia. Yang
perlu kita lakukan hanyalah menyiapkan struktur tabel tersebut.

Jika anda pernah membaca buku PHP Uncover atau OOP PHP Uncover, di studi kasus pada
bab terakhir saya selalu menyiapkan file generate.php. File ini terdiri dari perintah PHP serta
query MySQL, yang ketika dijalankan secara otomatis akan men-generate semua tabel yang
diperlukan. Migration kurang lebih seperti itu, plus berbagai fitur tambahan.

Migration sangat berguna untuk project yang dibuat dengan tim. Jika ada anggota tim ingin
mencoba aplikasi, tidak perlu membuat tabel secara manual dari phpMyAdmin, tapi cukup
jalankan file migration.

Dalam istilah yang lebih teknis, migration disebut sebagai version control untuk database.
Selain dipakai membuat tabel, kita juga bisa membuat step-by-step perubahan struktur tabel.

Misalnya hari ini programmer A membuat tabel mahasiswa dengan 6 kolom, kemudian
keesokan harinya programmer B memutuskan untuk memodifikasi menjadi 8 kolom. Namun
tambahan kolom ini membuat program menjadi bermasalah, maka programmer C bisa
memundurkan migration kembali ke posisi 6 kolom.

Kita akan bahas dengan detail cara penggunaan Migration.

13.3. File Migration Bawaan Laravel


Di Laravel 9, sudah terdapat beberapa file migration bawaan. File ini berada di folder
database\migrations.

Gambar: Isi folder database\migrations

Dalam folder ini terdapat 4 file migration, yakni:

 2014_10_12_000000_create_users_table.php

 2014_10_12_100000_create_password_resets_table.php

 2019_08_19_000000_create_failed_jobs_table.php

 2019_12_14_000001_create_personal_access_tokens_table.php

Setiap file migration dipakai untuk membuat 1 tabel. Artinya 4 file migration ini akan membuat

319
Migration

4 buah tabel ke dalam database.

Nama file migration diawali dengan timestamp, yakni waktu file tersebut dibuat. Dalam contoh
di atas, file migration 2014_10_12_000000_create_users_table.php dibuat pada tanggal 12
Oktober 2014.

Setelah timestamp, diikuti dengan nama migration. Nama ini boleh bebas, misalnya
2019_10_20_000000_halo_sedang_belajar.php . Namun format penulisan yang disarankan
adalah sebagai berikut:

<timestamp>_<proses>_<nama_tabel(s)>_table.php

Jika misalkan kita ingin membuat file migration untuk tabel mahasiswa, lebih baik ditulis
sebagai:

2019_10_20_000000_create_mahasiswas_table.php

Perhatikan bahwa ada tambahan huruf 's' di akhir. Ini adalah bentuk plural atau jamak dari
sebuah kata dalam bahasa inggris. Yup, dalam laravel kita di sarankan membuat nama tabel
dalam bentuk jamak, caranya tambahkan huruf s di akhir kata, seperti mahasiswas, dosens,
barangs, dst.

Keperluan untuk membuat nama tabel dalam bentuk jamak (dengan tambahan 's' di
akhir) baru akan terpakai saat kita masuk ke materi tentang Eloquent, yakni perintah
singkat untuk penulisan query SQL.

Jika ingin membuat nama tabel tanpa akhiran 's' juga tidak masalah, tapi nanti perlu
sedikit modifikasi tambahan. Agar tidak ada kendala, saya akan mengikuti aturan yang
umum dipakai, yakni dengan membuat nama tabel dengan tambahan 's' di akhir.

Menulis kata dalam bentuk jamak ini juga memudahkan kita dalam menebak jenis data.
Misalkan ada variabel bernama $mahasiswas, maka bisa di tebak kalau itu merupakan
array yang terdiri dari banyak mahasiswa. Sedangkan variabel $mahasiswa hanya berisi
data dari 1 mahasiswa saja.

Dengan aturan penulisan seperti ini, bisa kita lihat bahwa 4 file migration bawaan Laravel
dipakai untuk membuat tabel users, password_resets, failed_jobs, dan personal_access
_tokens.

Tabel users dan password_resets nantinya dipakai untuk proses authentication, yakni fitur
register, login dan logout user (akan kita bahas dalam bab terpisah).

Tabel failed_jobs dipakai untuk fitur Queues, sedangkan tabel personal_ access_tokens
dipakai untuk Laravel Sanctum. Kedua materi ini masuk ke level advanced dan belum kita
bahas dalam buku ini.

Mari lihat isi salah satu file, yakni 2014_10_12_000000_create_users_table.php :

320
Migration

database\migrations\2014_10_12_000000_create_users_table.php
1 <?php
2
3 use Illuminate\Database\Migrations\Migration;
4 use Illuminate\Database\Schema\Blueprint;
5 use Illuminate\Support\Facades\Schema;
6
7 class CreateUsersTable extends Migration
8 {
9 /**
10 * Run the migrations.
11 *
12 * @return void
13 */
14 public function up()
15 {
16 Schema::create('users', function (Blueprint $table) {
17 $table->id();
18 $table->string('name');
19 $table->string('email')->unique();
20 $table->timestamp('email_verified_at')->nullable();
21 $table->string('password');
22 $table->rememberToken();
23 $table->timestamps();
24 });
25 }
26
27 /**
28 * Reverse the migrations.
29 *
30 * @return void
31 */
32 public function down()
33 {
34 Schema::dropIfExists('users');
35 }
36 }

Di awal terdapat kode program untuk proses import beberapa class internal Laravel, yakni
Migration, Blueprint dan Schema (baris 3 – 5).

Kemudian di baris 7 masuk ke kode pembuatan class CreateUsersTable yang di extends dari
class Migration. Class ini memiliki 2 buah method: up() dan down().

Di dalam method up() inilah kode program untuk membuat tabel kita tulis, yakni
menggunakan static method Schema::create(). Argument pertama dari method ini berupa
nama tabel, yakni 'users'. Sedangkan argument kedua berupa sebuah closure tempat kita
menulis struktur kolom dari tabel 'users'.

Mulai dari baris 17 – 23 adalah tempat untuk menulis nama dan tipe kolom. Mengenai apa saja
tipe kolom untuk migration akan kita bahas sesaat lagi, tapi bisa dilihat sekilas bahwa nantinya

321
Migration

untuk tabel users akan terdapat kolom 'id', 'name', 'email', 'email_verified_at' serta 'password'.

Method selanjutnya adalah down() di baris 32. Method ini berisi perintah kebalikan dari
method up(). Jika di method up() kita membuat tabel 'users', maka di method down() ini
ditulis perintah untuk menghapus tabel 'users' menggunakan perintah Schema::dropIfExists
('users'). Inilah teknik yang dipakai agar migration bisa berfungsi sebagai version control.

Silahkan lihat juga kode program untuk kedua file migration lainnya, anda bisa perhatikan
bahwa semua file identik satu sama lain, yang berubah hanyalah isi dari method up() dan
down().

13.4. Menjalankan Migration


Kita akan coba jalankan file migration bawaan Laravel. Ketiga file migration ini akan membuat
tabel users, password_resets dan failed_jobs ke dalam database laravel yang sudah kita
siapkan.

Untuk menjalankan migration, silahkan buka cmd, masuk ke folder laravel dan jalankan
perintah berikut:

php artisan migrate

Gambar: Menjalankan perintah php artisan migrate

Apabila tampil pesan error, silahkan cek kembali apakah MySQL Server bawaan XAMPP
sudah berjalan atau belum.

Jika tampil hasil seperti di atas, maka proses migration sudah sukses berjalan. Silahkan buka
phpMyAdmin dan periksa isi database laravel.

322
Migration

Gambar: Isi database 'laravel'

Ternyata terdapat 5 tabel, yakni tabel users, password_resets, failed_jobs, personal_access


_tokens serta tabel migrations. Tabel migrations secara khusus dipakai untuk mencatat
proses migration yang terjadi. Mari kita lihat isi tabel ini:

Gambar: Isi tabel migrations

Tabel migration terdiri dari 3 kolom: id, migration dan batch. Kolom migration berisi semua
file migration yang sudah dijalankan, sedangkan kolom batch dipakai untuk mencatat urutan
proses migration. Semua file migration memiliki batch 1, karena kita memang baru
menjalankan 1 kali perintah php artisan migrate.

Mari lakukan sedikit percobaan dengan menghapus tabel users. Balik ke menu database, klik
link Drop di baris tabel users (1), lalu klik tombol OK (2) pada jendela konfirmasi.

323
Migration

Gambar: Hapus tabel users

Situasi ini sering terjadi dimana kita tidak sengaja menghapus sebuah tabel. Namun tidak
masalah, karena selama ada file migration, tabel bisa dibuat lagi dengan mudah.

Jalankan kembali perintah php artisan migrate:

Gambar: Menjalankan kembali perintah php artisan migrate

Hasilnya tampil pesan 'Nothing to migrate.', dimana Laravel mendeteksi tidak ada file migration
yang belum dijalankan. Ini terjadi karena file migration untuk tabel users sudah terdaftar di
tabel migrations.

Solusinya, kita bisa me-rollback atau menghapus semua migration yang terdaftar dengan
perintah php artisan migrate:reset

Gambar: Rollback semua tabel dengan perintah php artisan migrate:reset

324
Migration

Perintah php artisan migrate:reset akan menghapus isi tabel migration dan juga
menghapus semua tabel yang ada. Dengan demikian, kita bisa jalankan kembali php artisan
migrate.

Gambar: Jalankan kembali migration

Dengan perintah ini, semua tabel kembali ke kondisi semula. Kita tidak perlu khawatir untuk
memodifikasi tabel, karena jika ada sesuatu yang salah, tinggal jalankan ulang migration.

Laravel juga menyediakan perintah php artisan migrate:fresh sebagai cara singkat untuk
menghapus semua tabel dan langsung membuatnya kembali. Perintah ini ibarat perpaduan
dari php artisan migrate:reset dan php artisan migrate dalam sekali jalan.

Gambar: Me-rollback dan membuat ulang semua tabel

Fitur migration hanya dipakai untuk mengelola tabel dan struktur tabel, tapi tidak
dengan isi tabel itu sendiri. Jika anda juga ingin meng-generate isi tabel secara otomatis,
tersedia fitur lanjutan yang dinamakan Seeding. Untuk saat ini kita akan fokus ke
migration saja. Materi seeding akan menjadi jatah buku Laravel In Depth #1.

13.5. Migration Rollback


Pada saat menjalankan perintah php artisan migrate, file migration akan di eksekusi secara
berurutan sesuai tanggal timestamp. File dengan timestamp terbaru akan dijalankan paling

325
Migration

akhir.

Pada prakteknya, bisa saja file migration ini ditambah secara bertahap. Misalkan programmer
A sedang membuat fitur baru dan butuh tambahan sebuah tabel, maka dia bisa membuat dan
menjalankan file migration untuk tabel_a. Esoknya programmer B juga bisa membuat file
migration lain untuk tabel_b, dst.

Jika tiba-tiba terjadi masalah akibat penambahan tabel ini, kita bisa melakukan proses rollback
sebagian terhadap file migration. Jadi seolah-olah kembali ke struktur database di hari
sebelumnya.

Untuk melihat daftar urutan migration, bisa dari perintah php artisan migrate:status.

Gambar: Hasil dari perintah php artisan migrate:status

Di sini terlihat 4 file migration yang di urutkan berdasarkan timestamp, mulai dari tabel users,
tabel password_resets, dan tabel failed_jobs.

Jika saya ingin mengembalikan posisi sebelum file migration terakhir, bisa menggunakan
perintah berikut:

php artisan migrate:rollback --step=1

Gambar: Hasil dari perintah php artisan migrate:rollback --step=1

Perintah diatas akan me-rollback 1 file migration terakhir dan juga menghapus tabelnya. Akibat
perintah ini, tabel personal_access_tokens sudah tidak ada lagi di database.

Dalam project besar, bisa saja perlu mundur 6 atau 10 step jika diperlukan. Caranya, cukup
mengatur nilai --step. Misalnya untuk mundur sebanyak 7 file migration, perintahnya adalah
php artisan migrate:rollback --step=7 .

Jika perintah php artisan migrate:status dijalankan kembali, akan terlihat sedikit
perubahan.

326
Migration

Gambar: Hasil dari perintah php artisan migrate:status

Sekarang isi kolom "Ran?" untuk file migration personal_access_tokens berisi No, yang
menandakan file migration untuk tabel tersebut belum dijalankan atau sudah di rollback.

Jika kita berubah pikiran dan ingin menjalankan kembali file migration untuk tabel
failed_jobs, cukup dengan perintah php artisan migrate.

Gambar: Jalankan kembali proses migrate

Hasilnya, tabel personal_access_tokens sudah bisa digunakan kembali. Inilah fitur migration
sebagai version control, dimana kita bisa 'maju-mundur' untuk semua file migration. Jika
ternyata tabel baru yang ditambahkan menjadi masalah, tinggal di-rollback saja. Atau jika ada
tabel yang tidak sengaja terhapus, tinggal jalankan ulang file migration.

#Exercise

Anda bisa lakukan sebuah percobaan. Jalankan perintah php artisan migrate:rollback
--step=1, lalu cek dengan php artisan migrate:status. Kemudian jalankan php artisan
migrate. Perhatikan isi kolom batch, apakah ada perubahan?

Test kembali php artisan migrate:rollback --step=2 , kemudian php artisan migrate,
dan cek kembali di php artisan migrate:status.

13.6. Membuat Migration


Kita sudah pelajari bagaimana menjalankan file migration bawaan Laravel. Sekarang saatnya
untuk membuat sebuah file migration sendiri.

Sama seperti controller, file migration bisa dibuat dari teks editor. Caranya, copy kode dari file

327
Migration

migration yang sudah ada, lalu edit di bagian yang diperlukan. Atau cara yang lebih praktis
adalah dari perintah php artisan dengan format berikut:

php artisan make:migration <nama_migration> --create=<nama_tabel>

Untuk nama_migration bisa di isi suka-suka, namun penulisan terbaik adalah dengan format:
<nama_proses>_<nama_tabel(s)>_table . Sebagai contoh, untuk membuat file migration tabel
mahasiswas, bisa dengan menjalankan perintah berikut:

php artisan make:migration create_mahasiswas_table --create=mahasiswas

Gambar: Membuat file migration

Hasilnya, di dalam folder database\migrations akan tampil file 2022_02_01_145155_create_


mahasiswas_table.php. Nama file ini akan berbeda karena tanggal timestamp di generate
secara otomatis yang diambil dari sistem komputer.

Penamaan tabel dengan akhiran 's' ini sudah kita bahas sebelumnya, yakni untuk
mengikuti aturan bawaan Laravel dimana nama database sebaiknya dibuat plural.

Ini bukan kewajiban karena Laravel tetap mengizinkan kita untuk membuat nama tabel
dibuat dengan kata biasa, namun nanti perlu sedikit konfigurasi jika ingin menggunakan
fitur Eloquent.

Agar lebih mudah dan terbiasa dengan penamaan umum di aplikasi Laravel, saya akan
buat semua nama tabel dengan akhiran 's', seperti mahasiswas, gurus, barangs, dst.

Alternatif lain yang juga banyak di pilih programmer indonesia adalah menggunakan
nama bahasa inggris untuk nama tabel, seperti students, teachers, items, dst.

Berikut isi dari file migration tersebut:

database/migrations/2022_02_01_145155_create_mahasiswas_table.php
1 <?php
2
3 use Illuminate\Database\Migrations\Migration;
4 use Illuminate\Database\Schema\Blueprint;
5 use Illuminate\Support\Facades\Schema;
6
7 return new class extends Migration
8
9 {
10 /**

328
Migration

11 * Run the migrations.


12 *
13 * @return void
14 */
15 public function up()
16 {
17 Schema::create('mahasiswas', function (Blueprint $table) {
18 $table->id();
19 $table->timestamps();
20 });
21 }
22
23 /**
24 * Reverse the migrations.
25 *
26 * @return void
27 */
28 public function down()
29 {
30 Schema::dropIfExists('mahasiswas');
31 }
32 }

Kode ini sangat mirip seperti yang ada di file migration bawaan Laravel. Kita akan langsung
fokus ke method up() saja, karena di sinilah tempat untuk menulis struktur tabel.

Format penulisan nama kolom tabel adalah sebagai berikut:

$table-><tipe_data_kolom>('<nama_kolom>')

Untuk tipe_data_kolom, tidak selalu sesuai dengan bawaan MySQL. Laravel menyediakan
berbagai tipe data baru yang kadang merupakan gabungan dari tipe data kolom MySQL.

Sebagai contoh, di baris 17 terdapat pemanggilan method $table->id(), ini dipakai untuk
membuat kolom bertipe big integer yang langsung di set dengan auto increment.

Tabel berikut merangkum jenis tipe data kolom yang bisa dipakai:

Command Description
$table->id(); Alias of $table->bigIncrements('id').
Alias of $table-
$table->foreignId('user_id');
>unsignedBigInteger('user_id')
Auto-incrementing UNSIGNED BIGINT
$table->bigIncrements('id');
(primary key) equivalent column.
$table->bigInteger('votes'); BIGINT equivalent column.
$table->binary('data'); BLOB equivalent column.
$table->boolean('confirmed'); BOOLEAN equivalent column.
CHAR equivalent column with an optional
$table->char('name', 100);
length.

329
Migration

Command Description
$table->date('created_at'); DATE equivalent column.
$table->dateTime('created_at'); DATETIME equivalent column.
DECIMAL equivalent column with a precision
$table->decimal('amount', 8, 2);
(total digits) and scale (decimal digits).
DOUBLE equivalent column with a precision
$table->double('amount', 8, 2);
(total digits) and scale (decimal digits).
$table->enum('level', ['easy','hard']); ENUM equivalent column.
FLOAT equivalent column with a precision
$table->float('amount', 8, 2);
(total digits) and scale (decimal digits).
Auto-incrementing UNSIGNED INTEGER
$table->increments('id');
(primary key) equivalent column.
$table->integer('votes'); INTEGER equivalent column.
$table->ipAddress('visitor'); IP address equivalent column.
$table->longText('description'); LONGTEXT equivalent column.
Auto-incrementing UNSIGNED MEDIUMINT
$table->mediumIncrements('id');
(primary key) equivalent column.
$table->mediumInteger('votes'); MEDIUMINT equivalent column.
$table->mediumText('description'); MEDIUMTEXT equivalent column.
Adds a nullable remember_token
$table->rememberToken();
VARCHAR(100) equivalent column.
$table->set('flavors','strawberry'); SET equivalent column.
Auto-incrementing UNSIGNED SMALLINT
$table->smallIncrements('id');
(primary key) equivalent column.
$table->smallInteger('votes'); SMALLINT equivalent column.
Adds a nullable deleted_at TIMESTAMP
$table->softDeletes();
equivalent column for soft deletes.
VARCHAR equivalent column with a optional
$table->string('name', 100);
length.
$table->text('description'); TEXT equivalent column.
$table->time('sunrise'); TIME equivalent column.
$table->timestamp('added_on'); TIMESTAMP equivalent column.
Adds nullable created_at and updated_at
$table->timestamps();
TIMESTAMP equivalent columns.
Auto-incrementing UNSIGNED TINYINT
$table->tinyIncrements('id');
(primary key) equivalent column.
$table->tinyInteger('votes'); TINYINT equivalent column.
$table->unsignedBigInteger('votes'); UNSIGNED BIGINT equivalent column.

330
Migration

Command Description
UNSIGNED DECIMAL equivalent column
$table->unsignedDecimal('amount',8,2); with a precision (total digits) and scale
(decimal digits).
$table->unsignedInteger('votes'); UNSIGNED INTEGER equivalent column.
$table->unsignedMediumInteger('votes'); UNSIGNED MEDIUMINT equivalent column.
$table->unsignedSmallInteger('votes'); UNSIGNED SMALLINT equivalent column.
$table->unsignedTinyInteger('votes'); UNSIGNED TINYINT equivalent column.
$table->uuid('id'); UUID equivalent column.
$table->year('birth_year'); YEAR equivalent column.

Sebagian besar jenis tipe data sudah ada di tabel di atas. Untuk daftar lengkapnya bisa ke
https://laravel.com/docs/9.x/migrations.

Dari daftar ini ada beberapa tipe data yang bisa men-generate kolom lain. Sebagai contoh
$table->timestamps() akan menambah 2 buah kolom, yakni created_at and updated_at ke
dalam tabel. Kedua kolom bertipe timestamp yang akan terisi otomatis pada saat data tabel
ditambah / dimodifikasi (tidak perlu diinput manual).

Kolom created_at and updated_at ini sangat bermanfaat proses mengurutkan data
berdasarkan tanggal dibuat dan tanggal modifikasi. Disarankan untuk selalu menambah
$table->timestamps() untuk setiap tabel yang dibuat.

Selain itu beberapa method punya pengaturan tambahan yang di input sebagai argument
kedua atau ketiga. Sebagai contoh, $table->char('name', 100) dipakai untuk membuat kolom
'name' dengan tipe data CHAR(100). Begitu juga dengan method $table->double('amount', 8,
2) yang dipakai untuk membuat kolom 'amount' dengan tipe data DOUBLE(8,2).

Bahasan tentang jenis -jenis tipe data untuk kolom tabel MySQL merupakan materi di
luar buku ini. Jika anda tertarik, bisa membacanya dari buku MySQL Uncover. Di sana
saya membahas tipe data tabel MySQL dengan cukup detail (termasuk fitur MySQL lain).

Dari file migration yang di generate oleh perintah php artisan, tabel mahasiswas sudah
memiliki 2 method pembuatan kolom:

1 public function up()


2 {
3 Schema::create('mahasiswas', function (Blueprint $table) {
4 $table->id();
5 $table->timestamps();
6 });
7 }

Langsung saja kita coba jalankan dengan perintah php artisan migrate.

331
Migration

Gambar: Menjalankan file migration untuk tabel mahasiswas

Untuk melihat struktur tabel, bisa dengan menjalankan perintah query DESC mahasiswas dari
cmd MySQL Client:

Gambar: Struktur detail dari tabel mahasiswas

Hasilnya, terlihat tabel mahasiswa memiliki struktur kolom sebagai berikut:

 Kolom 'id' bertipe BIGINT(20) dengan atribut unsigned, primary key dan auto
increment.

 Kolom 'created_at' bertipe TIMESTAMP dan bisa diisi nilai null.

 Kolom 'updated_at' bertipe TIMESTAMP dan bisa diisi nilai null.

Saya akan tambah beberapa kolom lain ke dalam file migrate mahasiswas:

database/migrations/2022_02_01_145155_create_mahasiswas_table.php
1 public function up()
2 {
3 Schema::create('mahasiswas', function (Blueprint $table) {
4 $table->id();
5 $table->char('nim',8);
6 $table->string('nama');
7 $table->string('tempat_lahir');

332
Migration

8 $table->date('tanggal_lahir');
9 $table->string('fakultas');
10 $table->string('jurusan');
11 $table->decimal('ipk',3,2);
12 $table->timestamps();
13 });
14 }

Terdapat tambahan 7 kolom baru (baris 5 - 11). Di baris 5, method $table->char('nim',8)


dipakai untuk membuat kolom 'nim' dengan tipe CHAR(8).

Kemudian di baris 6, 7, 9 dan 10 saya menggunakan $table->string() untuk membuat kolom


'nama', 'tempat_lahir', 'fakultas', dan 'jurusan'. Keempat kolom ini akan dikonversi menjadi tipe
data VARCHAR(255).

Di baris 8, method $table->date('tanggal_lahir') dipakai untuk membuat kolom


'tanggal_lahir' dengan tipe data DATE.

Terakhir di baris 11 terdapat method $table->decimal('ipk',3,2) untuk membuat kolom 'ipk'


dengan tipe data DECIMAL(3,2).

Save file migrate, rollback 1 step dengan method php artisan migrate:rollback --step=1 ,
lalu jalankan kembali php artisan migrate:

Gambar: rollback dan jalankan kembali file migrate mahasiswas

Dan berikut hasil dari query DESC mahasiswas:

MariaDB [laravel]> DESC mahasiswas;


+---------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| nim | char(8) | NO | | NULL | |
| nama | varchar(255) | NO | | NULL | |
| tempat_lahir | varchar(255) | NO | | NULL | |
| tanggal_lahir | date | NO | | NULL | |
| fakultas | varchar(255) | NO | | NULL | |
| jurusan | varchar(255) | NO | | NULL | |
| ipk | decimal(3,2) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+---------------+---------------------+------+-----+---------+----------------+

333
Migration

Inilah struktur tabel yang dihasilkan dari migration. Tergantung kebutuhan, kita tinggal
menambah kolom yang sesuai berdasarkan daftar method yang ada di tabel sebelumnya.

Laravel juga menyediakan method lanjutan untuk menambah atribut khusus atau modifier ke
dalam kolom. Misalnya untuk membuat nilai default, men-set kolom agar bisa menerima nilai
null, mengatur charset, dll. Penulisan method ini di-chaining dari method yang dipakai untuk
membuat kolom.

Sebagai contoh, untuk men-set kolom 'nim' agar tidak bisa diinput dengan nilai yang sama,
bisa ditulis sebagai:

$table->char('nim',8)->unique();

Atau agar kolom 'ipk' memiliki nilai default 1.00 bisa ditulis dengan perintah:

$table->decimal('ipk',3,2)->default(1.00);

Berikut daftar tambahan atribut untuk Migration:

Command Description
->after('column') Place the column "after" another column (MySQL)
Set INTEGER columns as auto-increment (primary
->autoIncrement()
key)
->charset('utf8') Specify a character set for the column (MySQL)
Specify a collation for the column
->collation('utf8_unicode_ci')
(MySQL/PostgreSQL/SQL Server)
->comment('my comment') Add a comment to a column (MySQL/PostgreSQL)
->default($value) Specify a "default" value for the column
->first() Place the column "first" in the table (MySQL)
Allows (by default) NULL values to be inserted into
->nullable($value = true)
the column
->storedAs($expression) Create a stored generated column (MySQL)
->unsigned() Set INTEGER columns as UNSIGNED (MySQL)
Set TIMESTAMP columns to use
->useCurrent()
CURRENT_TIMESTAMP as default value
->virtualAs($expression) Create a virtual generated column (MySQL)
Create an identity column with specified sequence
->generatedAs($expression)
options (PostgreSQL)
Defines the precedence of sequence values over
->always()
input for an identity column (PostgreSQL)

Tidak semua tambahan perintah ini bisa dipakai di setiap aplikasi database, beberapa ada yang
hanya tersedia untuk database MySQL, dan ada juga yang hanya bisa dipakai untuk database

334
Migration

PostgreSQL.

Sebagai praktek, saya akan modifikasi ulang file migration untuk tabel mahasiswas:

database/migrations/2022_02_01_145155_create_mahasiswas_table.php
1 public function up()
2 {
3 Schema::create('mahasiswas', function (Blueprint $table) {
4 $table->id();
5 $table->char('nim',8)->unique();
6 $table->string('nama');
7 $table->string('tempat_lahir');
8 $table->date('tanggal_lahir');
9 $table->string('fakultas');
10 $table->string('jurusan');
11 $table->decimal('ipk',3,2)->default(1.00);
12 $table->timestamps();
13 });
14 }

Perubahannya ada di baris 5 dan 11, dimana saya menambahkan method unique() dan
default() ke kolom 'nim' dan 'ipk'.

Agar perubahan ini bisa diterapkan ke tabel mahasiswas, silahkan rollback, lalu migrate
kembali. Dan berikut hasil dari query DESC mahasiswas:

MariaDB [laravel]> DESC mahasiswas;


+---------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| nim | char(8) | NO | UNI | NULL | |
| nama | varchar(255) | NO | | NULL | |
| tempat_lahir | varchar(255) | NO | | NULL | |
| tanggal_lahir | date | NO | | NULL | |
| fakultas | varchar(255) | NO | | NULL | |
| jurusan | varchar(255) | NO | | NULL | |
| ipk | decimal(3,2) | NO | | 1.00 | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+---------------+---------------------+------+-----+---------+----------------+

Hasilnya, kolom nim memiliki index UNI, yang merupakan singkatan dari UNIQUE. Dimana
MySQL akan menampilkan pesan error jika kita menginput nomor nim yang berulang. Atau
dengan kata lain inputan data nim harus unik.

Untuk kolom IPK sekarang sudah memiliki nilai default 1.00, yang bisa dilihat dari kolom
Default.

335
Migration

13.7. Alter Table Migration


Migration tidak hanya dipakai untuk membuat dan menghapus tabel, tapi juga untuk
modifikasi struktur tabel (menjalankan query ALTER). Ini cukup sering kita lakukan sepanjang
pembuatan project.

Misalnya tiba-tiba client memberitahu ada perubahan data yang butuh modifikasi struktur
tabel. Sebagai antisipasi, kita bisa membuat file migration baru yang berisi perintah modifikasi
tersebut. Jika ternyata ada masalah, dengan 1 perintah rollback, tabel bisa kembali ke bentuk
semula.

Agar bisa melakukan modifikasi tabel ke dalam migration, Laravel butuh sebuah library
tambahan bernama Doctrine DBAL. Proses instalasi library ini sangat mudah, cukup jalankan
perintah berikut di folder laravel:

composer require doctrine/dbal

Gambar: Instalasi doctrine/dbal library

Berikutnya, saya ingin memodifikasi struktur tabel mahasiswas. Silahkan buat file migration
baru dengan nama alter_mahasiswas_table:

php artisan make:migration alter_mahasiswas_table --table=mahasiswas

Gambar: Buat file migration alter_mahasiswas_table

Kemudian buka file migration ini di teks editor. Terlihat method up() dan down() tidak berisi
kode apapun karena Laravel bisa mendeteksi kalau tabel mahasiswas sudah ada, sehingga tidak
mungkin file migration juga dipakai pembuatan tabel lagi.

Modifikasi file migration sebagai berikut:

336
Migration

database/migrations/2020_03_04_151623_alter_mahasiswas_table.php
1 <?php
2
3 use Illuminate\Database\Migrations\Migration;
4 use Illuminate\Database\Schema\Blueprint;
5 use Illuminate\Support\Facades\Schema;
6
7 return new class extends Migration
8 {
9 /**
10 * Run the migrations.
11 *
12 * @return void
13 */
14 public function up()
15 {
16 Schema::table('mahasiswas', function (Blueprint $table) {
17 $table->renameColumn('nama','nama_lengkap');
18 $table->text('alamat')->after('tanggal_lahir');
19 $table->dropColumn('ipk');
20 });
21 }
22
23 /**
24 * Reverse the migrations.
25 *
26 * @return void
27 */
28 public function down()
29 {
30 Schema::table('mahasiswas', function (Blueprint $table) {
31 $table->renameColumn('nama_lengkap','nama');
32 $table->dropColumn('alamat');
33 $table->decimal('ipk',3,2)->default(1.00);
34 });
35 }
36 }

Di dalam method up() saya membuat 3 buah perintah modifikasi:

 Method $table->renameColumn('nama','nama_lengkap') dipakai untuk mengubah


nama kolom 'nama' menjadi 'nama_lengkap'.

 Method $table->text('alamat')->after('tanggal_lahir') dipakai untuk menambah


kolom 'alamat' dengan tipe data TEXT, yang posisinya ditempatkan setelah kolom
'tanggal_lahir'.

 Method $table->dropColumn('ipk') dipakai untuk menghapus kolom 'ipk'.

Ketiga perubahan di method up() ini harus kita balik di method down():

 Method $table->renameColumn('nama_lengkap','nama') dipakai untuk mengubah


kembali nama kolom dari 'nama_lengkap' menjadi 'nama'.

337
Migration

 Method $table->dropColumn('alamat') dipakai untuk menghapus kolom 'alamat'.

 Method $table->decimal('ipk',3,2)->default(1.00) dipakai untuk membuat kembali


kolom 'ipk' dengan tipe data DECIMAL(3,2) dan nilai default 1.00.

Kode program di dalam method up() dan down() harus berpasangan agar proses rollback bisa
berlangsung dengan baik.

Sekarang mari kita jalankan perubahan ini dengan perintah php artisan migrate:

Gambar: Jalankan migration alter_mahasiswas_table

Kemudian cek struktur tabel mahasiswas dari MySQL Client:

MariaDB [laravel]> DESC mahasiswas;


+---------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------+----------------+
| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment |
| nim | char(8) | NO | UNI | NULL | |
| nama_lengkap | varchar(255) | NO | | NULL | |
| tempat_lahir | varchar(255) | NO | | NULL | |
| tanggal_lahir | date | NO | | NULL | |
| alamat | text | NO | | NULL | |
| fakultas | varchar(255) | NO | | NULL | |
| jurusan | varchar(255) | NO | | NULL | |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
+---------------+---------------------+------+-----+---------+----------------+

Sip, tabel mahasiswas telah berhasil di modifikasi. Kolom 'nama' sudah berubah jadi 'nama_
lengkap', kolom 'alamat' juga telah ditambahkan dan berada setelah kolom ' tanggal_lahir',
serta kolom 'ipk' juga tidak lagi ditemukan.

Apabila setelah beberapa saat terjadi masalah atau kita berubah pikiran, perubahan ini bisa di
rollback dengan php artisan migrate:rollback --step=1 :

Gambar: Rollback migration alter_mahasiswas_table

338
Migration

Hasilnya, struktur tabel mahasiswas akan kembali ke bentuk semula. Kunci dari proses ini, isi
method down() harus bisa membalik perubahan yang dilakukan oleh method up().

Selain apa yang kita bahas di sini, masih terdapat beberapa fitur migration lain seperti
modifikasi index, update atribut kolom, serta menambah key. Agar materi kita tidak
terlalu panjang, jika tertarik anda bisa lanjut baca ke dokumentasi Laravel di Database:
Migrations.

---

Migration merupakan fitur yang sangat berguna. Selain memudahkan kerja tim, migration
juga sangat praktis ketika kita ingin men-deploy aplikasi di komputer client atau di web
hosting karena tidak perlu repot-repot buat tabel secara manual. Bayangkan jika ada 10 tabel
yang harus dibuat satu per satu menggunakan phpMyAdmin.

Alternatif lain untuk membuat tabel secara massal juga bisa menggunakan fitur export-
import MySQL (perintah mysqldump).

Selain itu, fitur version control dari migration juga bisa meminimalisir dampak kesalahan. Jika
anda ragu saat mengubah struktur tabel yang mungkin bisa jadi masalah, buatlah sebuah file
migration baru. Jika terjadi error atau hal lain, tinggal di rollback ke kondisi semula.

Lanjut, kita akan membahas DB Facade.

# Terimakasih sudah membeli eBook / buku asli dari Duniailkom #

------------------------------------------------------------------

Saya menyadari menulis eBook sangat beresiko karena mudah di bajak dan digandakan.
Namun ini saya lakukan agar teman-teman (terutama yang di daerah) bisa mendapat
materi belajar programming berkualitas dengan harga yang relatif terjangkau.

Proses penulisan buku ini juga tidak sebentar, butuh waktu berbulan-bulan. Mohon kerja
sama teman-teman semua untuk tidak menggandakan dan menyebarkan eBook ini. Hak
cipta eBook sudah terdaftar di Depkumham RI. Pelanggaran akan dituntut sesuai UU
yang berlaku.

~ Semoga ilmu yang didapat berkah dan bermanfaat. Terimakasih ~

=====================================================================

339

Anda mungkin juga menyukai