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!
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:
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? 😁
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) {...}
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()
{
//
}
};
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()
{
//
}
};
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?
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()
{
//
}
};
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()
{
//
}
};
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:
deleted_at
.deleted_at
akan diisi dengan tanggal terjadi penghapusan data.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:
Kekurangan menggunakan SoftDelete:
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()
{
//
}
};
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?
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? 😁
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.
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! 👍
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. 😊