Fitur migration (migrasi) pada Laravel sejatinya sudah lama diperkenalkan. Dengan fitur ini, kita dimungkinkan untuk membuat dan memodifikasi tabel yang ada pada pangkalan data. Dengan begitu, kita tidak perlu dibuat repot untuk menjalankan syntax SQL dari terminal atau editor khusus. Cukup dengan satu perintah, maka perubahan di pangkalan data dapat dilakukan tanpa harus mengganggu tabel dan data yang sudah ada.
Migration pada dasarnya bersifat agnostik, tak hanya spesifik di Laravel. Di beberapa framework PHP modern hampir semuanya memiliki fitur ini. Bahkan, bukan hanya di PHP saja adanya, di bahasa framework bahasa pemrograman lain pun tersedia. Migration seolah menjadi standar dalam modifikasi pangkalan data secara “on the fly”.
Sayangnya, di beberapa aplikasi yang sudah cukup besar (tertentu), kita tidak diizinkan untuk menggunakan migration. Pasalnya, user pangkalan data yang digunakan tidak punya hak akses untuk menjalankan DDL (Data Definition Language). Walau begitu, migration tetap harus dibuat dengan pertimbangan:
- Arsip dan log perubahan pada pangkalan data.
- Kemudahan development ketika bekerja dalam tim.
Jika Anda pernah memakai tools versioning seperti git atau SVN, maka konsep yang dibawa oleh database migration sejatinya sama, yaitu untuk mendokumentasikan setiap perubahan yang terjadi terhadap skema database.
Cukup kata pengantarnya, langsung saja masuk ke tahap pembuatan migration pada Laravel.
Daftar Isi
Mengatur Koneksi Basisdata
Sesuaikan pengaturan basisdata pada berkas .env
.
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=root
Membuat Berkas Migration
Berkas migration terletak pada direktori database/migrations
. Mulai versi 5.3, migration yang berada pada vendor (misal: vendor/package/database/migrations
) tetap berada di sana tanpa mengganggu direktori migration utama.
Cara mudah membuat berkas migration adalah menggunakan Artisan console. Semisal, kita ingin membuat tabel baru dengan nama pages
.
$ php artisan make:migration create_pages_table — create=pages
Opsi create
pada perintah di atas berfungsi untuk memberikan instruksi bahwa nama yang digunakan pada tabel baru adalah pages. Selengkapnya mengenai opsi dan aksi pada artisan dapat dilihat pada bantuan.
$ php artisan
Membuat Tabel dengan Migration
Dapat dilihat pada direktori database/migrations
, terdapat sebuah berkas baru dengan penamaan kurang lebih seperti 2016_10_11_014905_create_pages_table.php
. Prefix tanggal pada berkas tersebut untuk menghindari konflik ketika dalam waktu bersamaan developer membuat migration serupa.
Isi dari berkas tersebut kurang lebih sebagai berikut:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('pages', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('pages'); } }
Dalam method up()
, terdapat method create()
dan class Schema yang berfungsi untuk membuat tabel baru dengan nama pages. sedangkan di method down()
sendiri berisi method dropIfexists()
dari class Schema yang berfungsi untuk menghapus tabel pages
apabila di-rollback.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('pages', function (Blueprint $table) { $table->increments('id'); $table->string('slug', 150)->unique(); $table->string('title', 100); $table->text('content'); $table->enum('status', ['drafted', 'published'])->default('drafted'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('pages'); } }
Berikut sedikit penjelasannya.
Schema::create('pages', function (Blueprint $table) {..}
memanggil methodcreate()
dari class Schema.$table->increments('id');
method untuk membuat kolom increment dengan namaid
.$table->string('slug', 150)->unique();
membuat kolom tipe data string dengan panjang 150 karakter dan bersifat unik (UNIQUE).$table->text('content');
membuat kolom dengan tipe text.$table->enum('status', ['drafted', 'published'])->default('drafted');
membuat kolom dengan tipe enum dengan dua nilai, yaitu “drafted” dan “published”, dan menjadikan “drafted” sebagai nilai default.$table->timestamps();
merupakan method yang secara otomatis akan membuat dua buah kolom spesial Eloquent dengan namacreated_at
danupdated_at
.
Menjalankan Migration
Dengan artisan, kita cukup menjalankan perintah di bawah.
$ php artisan migrate Migrated: 2016_10_11_014905_create_pages_table
Untuk memastikan tabel pages
berhasil dibuat, bisa dilakukan pengecekan melalui SQL editor pada pangkalan data sesuai pengaturan di atas.
Selain tabel pages
, kita juga bakal mendapati tabel dengan nama migrations
. Tabel ini berfungsi untuk menyimpan informasi seputar migration yang kita buat.
Memodifikasi Tabel dengan Migration
Tak hanya membuat tabel baru, dengan migration, kita juga bisa memodifikasi kolom atau atribut lain pada tabel yang sudah ada. Semisal, dalam tabel pages
, kita ingin menambahkan kolom baru dengan nama user_id
. Untuk inisiasi berkas migration-nya, menggunakan perintah kurang lebih seperti di bawah.
$ php artisan make:migration add_user_id_field_to_pages_table — table=pages
Penamaan migrasi kali ini sedikit lebih panjang. Hal ini bertujuan untuk memberikan informasi sedetail mungkin tentang migrasi yang akan dijalankan. Opsi table
menginstruksikan Laravel untuk menambah parameter nama tabel dan mengubah tabel yang sudah ada.
Dengan perintah di atas, maka akan menghasilkan berkas baru dengan isi kurang lebih seperti ini.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddUserIdFieldToPagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('pages', function (Blueprint $table) { // }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('pages', function (Blueprint $table) { // }); } }
Modifikasi berkas di atas menjadi seperti di bawah.
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddUserIdFieldToPagesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { if (Schema::hasTable('pages')) { Schema::table('pages', function (Blueprint $table) { $table->integer('user_id')->after('id'); }); } } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('pages', function (Blueprint $table) { // }); } }
Penjelasan singkatnya:
$table->integer('user_id')->after('id');
menambahkan field baru dengan namauser_id
, dan meletakkannya setelah field id dengan menggunakan methodafter()
. Selain itu, sebelum blok script tersebut dibuat, juga ditambahkan pengecekan untuk memastikan tabelpages
memang sudah ada.
Rollback Migration
Sederhananya, rollback bisa berarti membatalkan aksi terakhir dari migration. Di Laravel versi 5.3, kita dapat menentukan sendiri jumlah langkah rollback migration. Satu langkah berarti satu berkas migration.
$ php artisan migrate:rollback Rolled back: 2016_10_11_014905_create_pages_table
Dalam versi 5.3, dapat menggunakan opsi step
untuk menentukan berapa langkah migration yang harus dimundurkan.
$ php artisan migrate:rollback --step=2
Apabila ingin membatalkan semua migration, maka cukup dengan menjalankan perintah php artisan migrate:reset
.
Masih ada tiga aksi lagi yang tersedia pada migration, ialah status refresh
dan install
, yang ketiganya berfungsi sebagai berikut:
install
membuat repositori migration.refresh
rollback sepenuhnya migration, kemudian menjalankan ulang migration tersebut dari awal.status
memeriksa status migrasi saat ini.
$ php artisan migrate:status +------+------------------------------------------------+ | Ran? | Migration | +------+------------------------------------------------+ | Y | 2014_10_12_000000_create_users_table | | N | 2014_10_12_100000_create_password_resets_table | | N | 2016_10_11_014905_create_pages_table | +------+------------------------------------------------+
Selain membuat tabel dan memodifikasinya, masih ada banyak hal yang dapat dilakukan dengan migration pada Laravel. Aksi lainnya semisal menghapus atau mengganti nama tabel yang sudah ada, menghapus field, membuat indeks, foreign key, dan lainnya. Tutorial di atas merupakan basic yang sudah mencakup sebagian besar fitur migrations, sisanya, silakan pelajari sendiri melalui laman resmi Laravel. ?