Tutorial Lengkap CRUD Laravel 9 #2 Database dan Migration

Wildan Fuady
Wildan Fuady Seorang yang suka kopi beraroma manis, memikat dan membantunya lebih produktif. Laravel 02-10-202421 min read 397x dibaca 0 Comments
Tutorial Lengkap CRUD Laravel 9 #2 Database dan Migration

Tutorial Lengkap CRUD Laravel 9 Menggunakan #2 Database dan Migration - Halo teman-teman, kali ini kita akan belajar CRUD Laravel 9 menggunakan Bootstrap 5. Di tutorial kali ini, selain belajar cara membuat crud di Laravel 9, kita juga akan membahas cara mengintegrasikan database dan migration. Nah, daripada penasaran, yuk langsung kita mulai aja!

Lebih Mudah Manajemen Database dengan Migration

Dahulu kala, membuat database beserta tablenya dilakukan secara manual. Belum lagi ketika menambahkan field pada table, mengubah primary key, foreign key, indexes dan lain-lain, pasti sangat merepotkan.

Misalnya saat website sudah besar, kemudian ada perubahan pada salah satu field, maka kita akan kesulitan mengubahnya secara manual.

Tentu hal ini ingin kita hindari.

Oleh sebab itu di Laravel 9 tersedia migration yang dapat membantu kita mengelola database secara lengkap dan berbasis script.

Fitur-fitur yang terdapat di migration antara lain:

  1. Membuat, Mengubah dan Menghapus Table
  2. Mengatur Primary Key dan Foreign Key
  3. Mengatur Indexes
  4. Mengatur Relasi
  5. Mengaktifkan Fitur Soft Delete
  6. Mengaktifkan / Menonaktifkan Foreign Key
  7. Mengubah Nama Field / Column
  8. Menghapus Field / Column
  9. Etc

Keuntungan lainnya dalam menggunakan migration sangat terasa saat mengerjakan project bersama TIM, di mana harus ada saling koordinasi antar TIM terutama soal manajemen database.

TIM akan dengan mudah mengetahui apa saja perubahan-perubahan yang terjadi pada database, sehingga TIM cepat menyesuaikan project berdasarkan perubahan tersebut.

Keren ya? 😁

Membuat Nama Table di Migration

Cara membuat table melalui migration cukup mudah. Silahkan buka terminal / cmd, kemudian ketik perintah di bawah ini:

php artisan make:migration create_products_table

Perintah di atas akan menghasilkan sebuah file di dalam direktori blog/databases/migrations/****_create_products_table.php.

File tersebut bisa kita custom field-field apa saja yang akan dibuat di table products.

By default, kode program yang ada di dalam file tersebut seperti di bawah ini:



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

return new class extends Migration
{

    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('products');
    }
};

Bagian kode yang berfungsi memberikan nama table di dalam database adalah kode berikut:

Schema::create('products', function (Blueprint $table) {...}

Mengubah Nama Table di Migration

Bagaimana jika kita melakukan kesalahan saat memberikan nama pada table?

Contohnya ingin mengubah nama table products menjadi articles.

Pertama-tama kita buat dulu filenya dengan perintah di bawah ini:

php artisan make:migration rename_products_table

Di dalam file tersebut, kita tambahkan kode seperti di bawah ini:

Schema::rename('products', 'articles');

Berikut kode lengkapnya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::rename('products', 'articles');
    }

    public function down()
    {
        //
    }
};

Menghapus Table di Migration

Untuk menghapus table di migration, kita coba membuat filenya terlebih dahulu. Buka terminal / cmd dan ketik perintah berikut ini:

php artisan make:migration delete_articles_table

Nah, di dalam fungsi up(), kita tambahkan kode berikut ini:

/// menghapus table tanpa melakukan pengecekan
Schema::drop('articles');

/// menghapus table apabila table tersebut benar-benar ada
Schema::dropIfExists('articles');

Sangat disarankan menjalankan perintah yang kedua agar kodingan kita menjadi lebih baik. Sebab, segala sesuatu hal sebaiknya perlu dikorfirmasi sebelum melakukan tindakan. 😇

Contoh kodenya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::dropIfExists('articles');
    }

    public function down()
    {
        //
    }
};

Mengatur Primary Key dan Foreign Key

Laravel 9 telah menyediakan fasilitas berharga di dalam migration. Contohnya saat kita membuat table baru, Laravel telah menuliskan script primary key pada kode $table->id();.

Kadang kita ingin membuat primary key selain nama id, sehingga tidak memerlukan kode $table->id(); lagi.

Lantas, untuk membuat primary key baru, cukup dengan kode berikut ini:

$table->bigIncrements('article_id');

Perintah di atas akan membuat field article_id menjadi primary key.

Sedangkan untuk foreign key, kita bisa menuliskan kode berikut ini:

$table->bigInteger('category_id')->unsigned()->nullable();

/// jadikan field category_id sebagai foreign key yang berelasi dengan table categories
$table->foreign('category_id')->references('category_id')->on('categories');

/// bila ingin menambahkan cascade pada delete atau update
$table->foreign('category_id')->references('category_id')->on('categories')
    ->onDelete('cascade')
    ->onUpdate('cascade');

Kode lengkapnya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->string('slug')->nullable();
            $table->string('content')->nullable();
            $table->integer('status')->nullable();
            $table->bigInteger('category_id')->unsigned()->nullable();

            /// jadikan field category_id sebagai foreign key yang berelasi dengan table categories
            $table->foreign('category_id')->references('category_id')->on('categories');

            /// bila ingin menambahkan cascade pada delete atau update
            $table->foreign('category_id')->references('category_id')->on('categories')
                ->onDelete('cascade')
                ->onUpdate('cascade');
        });
    }

    public function down()
    {
        //
    }
};

Untuk menjalankan script di atas, kita perlu membuat table categories dulu ya.

Gimana? Cara menambahkan primary key dan foreign key ke dalam table cukup mudah kan?

Mengatur Index di Migration

Apa sih index itu? Jadi... index adalah salah satu fitur di dalam Mysql yang berfungsi untuk mempercepat percarian data pada kolom tertentu.

Apabila database dibuat tanpa menggunakan index, maka kinerja server database dapat menurun secara drastis.

Hal ini karena resource CPU banyak digunakan untuk pencarian data atau pengaksesan query SQL dengan metode table-scan.

... dengan menggunakan index, maka pencarian data menjadi lebih optimal karena lebih cepat dan tidak banyak menghabiskan resource CPU.

Contoh penggunakan index misalnya pada field status.

Biasanya status digunakan untuk menandai aktif / tidak aktif. Bisa juga menggunakan simbol 1 / 0.

Misalnya di table users terdapat field status untuk menentukan keaktifan user. Normalnya akan di isi dengan 1 bila user aktif dan 0 untuk user yang tidak aktif.

Nah, saat sistem mencari user yang aktif, otomatis akan melibatkan field status. Di sinilah peran index untuk mempercepat pencarian pada database.

Kebayang kan manfaat index?

Misalnya kita coba terapkan index pada table articles, maka kita bisa menulis kode sebagai berikut:

$table->id();
$table->string('judul')->nullable();
$table->string('slug')->nullable();
$table->string('isi')->nullable();
$table->integer('status')->nullable();
/// menambahkan index di field status
$table->index(['status']);

Kode lengkapnya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('judul')->nullable();
            $table->string('slug')->nullable();
            $table->string('isi')->nullable();
            $table->integer('status')->nullable();
            /// menambahkan index di field status
            $table->index(['status']);
        });
    }

    public function down()
    {
        //
    }
};

Mengatur Relasi

Di migration, kita bisa mengatur relasi antar table menunggunakan baris kode program.

Contohnya:

$table->foreign('category_id')->references('id')->on('categories');

Kita menggunakan field category_id untuk dijadikan foreign key yang akan berelasi dengan table categories.

Pada references('id') menunjukan bahwa di table categories terdapat field id yang menjadi primary key.

Sehingga kita bisa menghubungkannya.

Contoh kode lengkapnya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->string('slug')->nullable();
            $table->string('content')->nullable();
            $table->integer('status')->nullable();
            $table->bigInteger('category_id')->unsigned()->nullable();
            /// menambahkan index di field status
            $table->index(['status']);
            /// relasi dengan table categories
            $table->foreign('category_id')->references('id')->on('categories');
        });
    }

    public function down()
    {
        //
    }
};

Mengaktifkan Fitur Soft Delete

Soft Delete adalah salah satu fitur di migration yang berfungsi mencegah data yang dihapus, tidak 100% terhapus di database.

Maksudnya data yang kita hapus sebenarnya masih ada di database, hanya saja tidak terbaca oleh program.

Cara kerja Soft Delete:

  1. Membuat field baru bernama deleted_at.
  2. Jika salah satu record dihapus menggunakan class model, maka otomatis field deleted_at akan diisi dengan tanggal terjadi penghapusan data.
  3. Model hanya akan membaca record yang deleted_at nya null.

Akan ada penjelasan khusus tentang model di laravel 9 secara mendalam pada artikel selanjutnya.

Kita akan fokus dulu ke migrationnya.

Untuk cara penggunaannya, kita cukup tambahkan kode di bawah ini di migration:

$table->softDeletes();

Kemudian pada bagian model, kita tambahkan:

use Illuminate\Database\Eloquent\SoftDeletes;

Jangan lupa tambahkan use SoftDelete di dalam model.

...
use Illuminate\Database\Eloquent\SoftDeletes;

class Blog extends Model
{
    use SoftDeletes;

    /// proteksi field deleted_at
    protected $dates = ['deleted_at'];

    ...
}

Gimana cukup mudah kan?

Kelebihan menggunakan SoftDelete:

  1. Data yang pernah terhapus masih bisa diakses.
  2. Menjaga kehati-hatian apabila salah / lupa dalam menghapus data.

Kekurangan menggunakan SoftDelete:

  1. Record database semakin banyak jika tidak dihapus.
  2. Menjadi beban server apabila data yang sudah cukup lama terhapus tidak 100% dihapus.

Mengaktifkan / Menonaktifkan Foreign Key

Saya pernah mengalami kesulitan saat menghapus sebuah data, karena lupa menambahkan onDelete('cascade') terjadi error karena masalah foreign key.

Saat itu saya belum menggunakan soft delete karena website yang dikembangkan hanya skala kecil saja.

Akhirnya saya menemukan kendala.

Kemudian tak berselang lama saya menggunakan fitur aktif / tidak aktif pada migration, agar tidak menjadi bentrok.

Berikut tambahan kodenya:

/// untuk menon aktifkan foreign key
Schema::disableForeignKeyConstraints();

/// untuk mengaktifkan foreign key
Schema::enableForeignKeyConstraints();

Kode lengkapnya:



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

return new class extends Migration
{
    public function up()
    {
        Schema::disableForeignKeyConstraints(); /// di sini
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->string('slug')->nullable();
            $table->string('content')->nullable();
            $table->integer('status')->nullable();
            $table->bigInteger('category_id')->unsigned()->nullable();
            /// menambahkan index di field status
            $table->index(['status']);
            /// relasi dengan table categories
            $table->foreign('category_id')->references('id')->on('categories');
        });
        Schema::enableForeignKeyConstraints(); /// di sini
    }

    public function down()
    {
        //
    }
};

Mengubah Nama Field / Column

Untuk mengubah nama field, kita membutuhkan package doctrine/dbal.

Jika di project kita belum ada package ini, silahkan install dengan perintah:

composer require doctrine/dbal

Jika proses installasi package doctrine/dbal telah selesai, selanjutnya kita bisa mengubah nama pada field.

Contohnya:

/// mengubah nama field / column dari title menjadi judul
$table->renameColumn('title', 'judul');

/// mengubah tipe data pada field / column
$table->string('status')->nullable()->change();

Cukup mudah kan?

Menghapus Field / Column

Kita juga bisa menghapus field / column di migration.

Kita cukup menambahkan kode di bawah ini:

$table->dropColumn('slug');

Artinya kita akan menghapus field slug pada table blog.

Keren ya? 😁

Mengatur Database di Laravel 9

Kembali fokus pada project.

Silahkan buat database baru bernama db_blog.

Kemudian untuk menintegrasikannya, buka file .env dan pada bagian kode di bawah ini masukan nama database yang kita buat:

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

Pada bagian host, port, username dan password dapat menyesuaikan dengan perangkat yang kami miliki.

Membuat Table di Laravel 9

Setelah mengatur database, selanjutnya adalah menyiapkan table di dalam project.

Coba ketik:

php artisan make:migration create_blog_table;

Kemudian pada fungsi up() silahkan tambahkan:

public function up()
    {
        Schema::disableForeignKeyConstraints(); /// di sini
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable();
            $table->string('slug')->nullable();
            $table->string('content')->nullable();
            $table->integer('status')->nullable();
            $table->bigInteger('category_id')->unsigned()->nullable();
            /// menambahkan index di field status
            $table->index(['status']);
            /// menggunakan soft delete
            $table->softDeleted();
        });
        Schema::enableForeignKeyConstraints(); /// di sini
    }

Selanjutnya agar table blog tersimpan di database db_blog maka gunakan perintah di bawah ini:

php artisan migrate

Sekarang coba lihat database kamu, maka akan terlihat ada table bernama blogs.

Keren! 👍

Penutup

Demikianlah tutorial lengkap database dan migration di Laravel 9. Semoga pembelajaran ini dapat kita pahami dengan baik.

Jika masih belum berhasil dan menemukan error, silahkan tulis di kolom komentar.

Terima kasih.

Selamat ngopi, eh ngoding. 😊

Mungkin kamu juga suka: