Merancang Database dengan Mudah dengan Migration Laravel

Muhammad Fajri
Monday, 05 April 2021

Bismillahirrahmanirrahim.

Migration sederhananya merupakan cara yang digunakan untuk membuat database tanpa menggunakan perintah SQL tetapi di-generate melalui eksekusi menggunakan kode program.

Meskipun database yang dibuat tanpa melalui queri SQL, kita harus tetap menyediakan data yang diperlukan dalam pengembangan aplikasi yaitu tabel-tabel dan atribut-atribut yang dibutuhkan.

Sebelum membuat database, hapus terlebih dahulu seluruh isi file migrations yang ada pada folder database\migrations.

Membuat File Migrasi

Untuk membuat file migration, jalankan perintah:

php artisan make:migration create_students_table

Outputnya:

Created Migration: 2021_04_02_102318_create_students_table
  • php, untuk menjalankan PHP (dibutuhkan oleh Artisan CLI).
  • artisan, memanggil artisan itu sendiri.
  • make:, perintah untuk membuat folder baru diikuti parameter migration yang menunjukkan bahwa kita akan membuat file migration. Untuk file lainnya, ganti parameter migration sesuai kebutuhan.
  • create_students_table, parameter yang menginformasikan Artisan bahwa file migration yang akan dibuat adalah tabel students. Perlu diperhatikan bahwa awalan create_ sebagai informasi untuk membuat tabel. Dengan demikian, Artisan akan men-generate file migration dengan lebih lengkap jika tanpa awalan create_.

Isi file yang dihasilkan dapat dilihat pada file migration ter-generate di folder database.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateStudentsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('students');
    }
}

Salah satu tips yang juga sangat berguna adalah mengikuti aturan penamaan standar Laravel, hal ini sangat membantu kita. Contoh yang bisa kita terapkan dalam pembuatan file migration adalah pada Laravel nama sebuah tabel ditandai dengan kata jamak sedangkan untuk modelnya dikenali dengan dengan kata tunggal. Artinya untuk model dengan nama User akan dipadankan dengan tabel dengan nama users dan untuk model dengan nama Book akan dipadankan dengan tabel dengan nama books. Jika kita tidak mengikuti aturan penamaan ini, kita perlu menentukan secara manual apa nama tabel yang berpadanan dengan model kita.

Melengkapi File Migrasi

Lengkapi fungsi up() pada file migration create_students_table:

<?php
...
class CreateStudentsTable extends Migration
{
    public function up()
    {
        Schema::create('students', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('nama');
            $table->string('nim');
            $table->string('kelas');
            $table->string('jurusan');
            $table->unsignedInteger('angkatan');
            $table->timestamps();
        });
    }
...
}

Keterangan baris kode di atas:

  • Scheme::create('students, ...), kode untuk membuat tabel, students merupakan nama tabel yang akan dibuat.
  • $table->bigIncrements('id'), kode untuk membuat atribut id yang bertipe data big int, unsigned (tidak boleh bernilai negatif),not null (tidak boleh kosong), auto_increment (id akan bertambah satu saat ada data baru), dan dijadikan primary key.
  • $table->string('nama'), membuat atribut nama dengan tipe data varchar(255) dan not null. Hal ini pun sama untuk nim, kelas, dan jurusan.
  • $table->unsignedInteger('angkatan'), membuat atribut angkatan dengan tipe data int, unsigned (tidak boleh negatif), dan not null.
  • $table->timestamps(), untuk membuat atribut created_at dan updated_at yaitu timestamp (membuat tanggal dan waktu), null (bersifat opsional).

Mengeksekusi File Migrasi

Kita akan gunakan Artisan CLI untuk mengeksekusi file migrasi. Pastikan konfigurasi koneksi ke database sudah dilakukan di file .env.

php artisan migrate

Setelah dijalankan error berikut ditemui:

   Illuminate\Database\QueryException 

  could not find driver (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:678
    674▕         // If an exception occurs when attempting to run a query, we'll format the error                                                     
    675▕         // message to include the bindings with SQL, which will make this exception a                                                        
    676▕         // lot more helpful to the developer instead of just the database's errors.                                                          
    677▕         catch (Exception $e) {
  ➜ 678▕             throw new QueryException(
    679▕                 $query, $this->prepareBindings($bindings), $e
    680▕             );
    681▕         }
    682▕ 

      +33 vendor frames 
  34  artisan:37
      Illuminate\Foundation\Console\Kernel::handle()

Saat mencari referensi error tersebut, ditemukan forum yang memberikan solusi untuk meng-enable ;extension=php_pdo_mysql.dll di dalam file php.ini.

sudo nano /etc/php/php.ini

Saya menemukan baris ;extension=pdo_mysql dan langsung saja saya hilangkan tanda ;, kemudian menyimpan dan menutup file.

Saat ini dieksekusi kembali perintah php artisan migrate dan didapati error berikut:

...
  SQLSTATE[HY000] [1049] Unknown database 'blog' (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations and table_type = 'BASE TABLE')
...

Untuk mengatasiya, buat database dengan nama blog terlebih dahulu. Saya melakukannya melalui command line. Jalankan perintah berikut untuk dapat mengakses database.

mysql -p -u root
Enter password: #Type your password

Kemudian membuat database-nya:

create database blog;

Selanjutnya dieksekusi kembali php artisan migrate dan didapati output seperti ini:

Migration table created successfully.
Migrating: 2021_04_02_102318_create_students_table
Migrated:  2021_04_02_102318_create_students_table (271.52ms)

Setelah diperiksa di database baik melalui phpMyAdmin atau dari command line dapat dilihat telah ada tabel baru dengan nama migrate dan students di dalam database blog. Berikut isi tabelnya saat dilakukan perintah SELECT.

MariaDB [blog]> select * from migrations;
+----+-----------------------------------------+-------+
| id | migration                               | batch |
+----+-----------------------------------------+-------+
|  1 | 2021_04_02_102318_create_students_table |     1 |
+----+-----------------------------------------+-------+
1 row in set (0.024 sec)

MariaDB [blog]> select * from students;
Empty set (0.064 sec)

Isi tabel students masih kosong. Untuk melihat struktur filenya jalankan perintah DESC.

MariaDB [blog]> DESC students;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| nama       | varchar(255)        | NO   |     | NULL    |                |
| nim        | varchar(255)        | NO   |     | NULL    |                |
| kelas      | varchar(255)        | NO   |     | NULL    |                |
| jurusan    | varchar(255)        | NO   |     | NULL    |                |
| angkatan   | int(10) unsigned    | NO   |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
8 rows in set (0.116 sec)

Dengan demikian, pembuatan tabel dengan php Artisan telah berhasil.

Kelebihan Migration

Dalam pembuatan database dalam pengembangan aplikasi tidak diwajibkan menggunakan migration. Sah-sah saja membuat database dengan menggunakan query SQL atau yang lebih mudah membuat database dengan bantuan DBMS (Database Management System) seperti phpMyAdmin.

Namun, jika kita dapat menggunakan migration dalam pembuatan database tentu akan dirasakan perbedaannya. Waktu yang digunakan pun lebih efisien sehingga pengembangan aplikasi dapat dilakukan dengan lebih cepat.

Berikut beberapa kelebihannya:

  • Tidak membutuhkan file .sql untuk men-generate database yang kita buat jika orang lain ingin menggunakan aplikasi kita.
  • Terdapat catatan perubahan terhadap database yang dibuat. Jadi, jika sewaktu-waktu kita melakukan perubahan skema pada database seperti atributnya maka migration ini akan mencatat perubahannya.
  • Memiliki sintaks yang sederhana untuk men-generate sebuah database.

Referensi