Membuat Tabel dengan Migration


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.

— id-laravel.com

Cukup kata pengantarnya, langsung saja masuk ke tahap pembuatan migration pada Laravel.

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 method create() dari class Schema.
  • $table->increments('id'); method untuk membuat kolom increment dengan nama id.
  • $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 nama created_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 nama user_id, dan meletakkannya setelah field id dengan menggunakan method after(). Selain itu, sebelum blok script tersebut dibuat, juga ditambahkan pengecekan untuk memastikan tabel pages 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:

  1. install membuat repositori migration.
  2. refresh rollback sepenuhnya migration, kemudian menjalankan ulang migration tersebut dari awal.
  3. 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. 😉

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan