Membuat File Migrasi
Setup Database
Setelah installasi laravel sudah selesai, kemudian buat database dengan nama e_procurement
. Setelah itu buka file .env
dan sesuaikan koneksi database dengan nama database yang sudah dibuat.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=e_procurement
DB_USERNAME=root
DB_PASSWORD=
Membuat File Migrasi
File migrasi dibutuhkan untuk membuat ataupun mengubah struktur database sesuai dengan kebutuhan sistem. Kita akan membuat file migrasi untuk membuat table yang dibutuhkan untuk menyimpan data supplier, pengajuan pembelian barang, perbandingan harga, pemesanan barang dan penerimaan barang.
Supplier
Pertama, untuk menyimpan data supplier kita perlu membuat table supplier. Gunakan perintah berikut :
php artisan make:migration create_supplier_table
Kemudian buka file migrasi yang sudah dibuat di folder database/migrations
dan sesuaikan seperti dibawah ini.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('supplier', function (Blueprint $table) {
$table->id();
$table->string('nomor', 15);
$table->string('nama');
$table->string('email')->unique();
$table->text('alamat');
$table->string('pic');
$table->string('kontak_pic', 15);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('supplier');
}
};
Method up()
pada file migrasi akan dieksekusi pada saat kita menjalankan perintah php artisan migrate
, pada method tersebut kita akan membuat table supplier dengan komposisi column seperti diatas. Pada method down()
akan dieksekusi pada saat kita menjalankan perintah php artisan migrate:rollback
, pada method tersebut kita akan menghapus table supplier.
Pengajuan Pembelian Barang
Kedua, untuk menyimpan data pengajuan pembelian barang kita butuh dua table yaitu pengajuan_pembelian_barang
dan pengajuan_pembelian_barang_detail
.
php artisan make:migration create_pengajuan_pembelian_barang_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pengajuan_pembelian_barang', function (Blueprint $table) {
$table->id();
$table->string('nomor', 15);
$table->string('nama_pengajuan');
$table->text('keterangan');
$table->boolean('batal')->default(0);
$table->text('keterangan_batal')->nullable();
$table->timestamp('tanggal_batal')->nullable();
$table->foreignId('user_id')->constrained();
$table->timestamp('tanggal')->useCurrent();
});
Schema::create('pengajuan_pembelian_barang_detail', function (Blueprint $table) {
$table->id();
$table->foreignId('pengajuan_id')->constrained('pengajuan_pembelian_barang');
$table->string('nama_barang');
$table->text('spesifikasi');
$table->integer('jumlah');
$table->integer('harga_satuan');
$table->boolean('perbandingan')->default(0);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pengajuan_pembelian_barang_detail');
Schema::dropIfExists('pengajuan_pembelian_barang');
}
};
Pada table pengajuan_pembelian_barang_detail
kita tempatkan foreign key untuk table pengajuan_pembelian_barang
. Nantinya kita akan menggunakan relasi one to many dari pengajuan_pembelian_barang
ke pengajuan_pembelian_barang_detail
, sehingga karyawan dapat mengajukan lebih dari satu barang dalam satu kali pengajuan.
Perbandingan Harga
Ketiga, untuk menyimpan data perbandingan harga kita butuh tiga table yaitu perbandingan_harga
, perbandingan_harga_supplier
dan perbandingan_harga_item_barang
.
php artisan make:migration create_perbandingan_harga_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('perbandingan_harga', function (Blueprint $table) {
$table->id();
$table->string('nomor', 15);
$table->string('judul');
$table->foreignId('pengajuan_id')->constrained('pengajuan_pembelian_barang');
$table->foreignId('user_id')->constrained();
$table->timestamp('tanggal')->useCurrent();
});
Schema::create('perbandingan_harga_supplier', function (Blueprint $table) {
$table->id();
$table->foreignId('perbandingan_id')->constrained('perbandingan_harga');
$table->foreignId('supplier_id')->constrained('supplier');
$table->string('pic');
$table->string('kontak_pic');
$table->text('ketentuan_pembayaran');
});
Schema::create('perbandingan_harga_item_barang', function (Blueprint $table) {
$table->id();
$table->foreignId('perbandingan_supplier_id')->constrained(table: 'perbandingan_harga_supplier', indexName: 'perbandingan_foreign_key');
$table->foreignId('pengajuan_barang_detail_id')->constrained(table: 'pengajuan_pembelian_barang_detail', indexName: 'pengajuan_barang_foreign_key');
$table->string('nama_barang');
$table->text('spesifikasi');
$table->integer('jumlah');
$table->integer('harga_satuan');
$table->boolean('pemesanan')->default(0);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('perbandingan_harga_item_barang');
Schema::dropIfExists('perbandingan_harga_supplier');
Schema::dropIfExists('perbandingan_harga');
}
};
Untuk modul perbandingan harga kita tentukan komposisi table seperti diatas sehingga setiap perbandingan akan bisa berisi lebih dari satu supplier yang menawarkan harga untuk beberapa barang dari pengajuan pembelian barang. Kita akan tempatkan id perbandingan_harga
pada table perbandingan_harga_supplier
dan id perbandingan_harga_supplier
pada table perbandingan_harga_item_barang
sebagai foreign key.
Pemesanan Barang
Keempat, untuk menyimpan data pemesanan barang kita butuh dua table yaitu pemesanan_barang
dan pemesanan_barang_detail
.
php artisan make:migration create_pemesanan_barang_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('pemesanan_barang', function (Blueprint $table) {
$table->id();
$table->string('nomor', 15);
$table->foreignId('perbandingan_id')->constrained('perbandingan_harga');
$table->foreignId('supplier_id')->constrained('supplier');
$table->string('pic');
$table->string('kontak_pic');
$table->boolean('batal')->default(0);
$table->text('keterangan_batal')->nullable();
$table->timestamp('tanggal_batal')->nullable();
$table->foreignId('user_id')->constrained();
$table->timestamp('tanggal')->useCurrent();
});
Schema::create('pemesanan_barang_detail', function (Blueprint $table) {
$table->id();
$table->foreignId('pemesanan_id')->constrained('pemesanan_barang');
$table->foreignId('perbandingan_barang_id')->constrained(table: 'perbandingan_harga_item_barang', indexName: 'perbandingan_barang_foreign_key');
$table->string('nama_barang');
$table->text('spesifikasi');
$table->integer('jumlah');
$table->integer('harga_satuan');
$table->boolean('penerimaan')->default(0);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pemesanan_barang_detail');
Schema::dropIfExists('pemesanan_barang');
}
};
Setiap pemesanan akan ditujukan untuk satu supplier yang berisi pemesanan beberapa barang yang telah dipilih pada saat perbandingan harga. Kita tempatkan id pemesanan_barang
pada table pemesanan_barang_detail
sebagai foreign key.
Penerimaan Barang
Terakhir, untuk menyimpan data penerimaan barang kita butuh dua table yaitu penerimaan_barang
dan penerimaan_barang_detail
.
php artisan make:migration create_penerimaan_barang_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('penerimaan_barang', function (Blueprint $table) {
$table->id();
$table->string('nomor', 15);
$table->foreignId('pemesanan_id')->constrained('pemesanan_barang');
$table->date('tanggal_penerimaan');
$table->foreignId('supplier_id')->constrained('supplier');
$table->string('pengantar');
$table->string('penerima');
$table->boolean('batal')->default(0);
$table->text('keterangan_batal')->nullable();
$table->timestamp('tanggal_batal')->nullable();
$table->foreignId('user_id')->constrained();
$table->timestamp('tanggal')->useCurrent();
});
Schema::create('penerimaan_barang_detail', function (Blueprint $table) {
$table->id();
$table->foreignId('penerimaan_id')->constrained('penerimaan_barang');
$table->foreignId('pemesanan_barang_detail_id')->constrained(table: 'pemesanan_barang_detail', indexName: 'pemesanan_barang_foreign_key');
$table->string('nama_barang');
$table->integer('jumlah');
$table->text('keterangan');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('penerimaan_barang_detail');
Schema::dropIfExists('penerimaan_barang');
}
};
Setiap penerimaan akan bisa berisi lebih dari satu barang yang sebelumnya sudah dipesan. Kita tempatkan id penerimaan_barang
pada table penerimaan_barang_detail
sebagai foreign key.
Menjalankan Perintah Migrasi
Untuk menjalankan perintah migrasi kita bisa menggunakan perintah berikut.
php artisan migrate
Perintah tersebut akan mengeksekusi file migrasi yang sebelumnya sudah kita buat sesuai urutan timestamp pada filename migrasi. Filename migrasi akan disimpan ke table migrations
setelah proses migrasi dilakukan agar saat kita menjalankan perintah php artisan migrate
untuk kedua kalinya, file migrasi yang sudah tersimpan tidak akan dieksekusi lagi.
Jika kita ingin mengembalikan komposisi table di database seperti saat sebelum kita menjalankan perintah migrasi terakhir kita bisa gunakan perintah berikut.
php artisan migrate:rollback
Jika kita ingin menghapus semua table pada database dan mengeksekusi ulang semua file migrasi kita bisa gunakan perintah berikut.
php artisan migrate:fresh
Jangan pernah gunakan perintah perintah diatas pada aplikasi atau sistem yang sudah berjalan diproduction karena akan menghapus semua data yang ada.