Membuat File Migrasi


Tutup Daftar pelajaran ( / 46)

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.

.env
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 :

Terminal
php artisan make:migration create_supplier_table

Kemudian buka file migrasi yang sudah dibuat di folder database/migrations dan sesuaikan seperti dibawah ini.

2024_05_25_020620_create_supplier_table.php
<?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.

Terminal
php artisan make:migration create_pengajuan_pembelian_barang_table
2024_05_25_014302_create_pengajuan_pembelian_barang_table.php
<?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.

Terminal
php artisan make:migration create_perbandingan_harga_table
2024_05_25_100845_create_perbandingan_harga_table.php
<?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.

Terminal
php artisan make:migration create_pemesanan_barang_table
2024_05_25_102327_create_pemesanan_barang_table.php
<?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.

Terminal
php artisan make:migration create_penerimaan_barang_table
2024_05_25_103018_create_penerimaan_barang_table.php
<?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.

Terminal
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.

Terminal
php artisan migrate:rollback

Jika kita ingin menghapus semua table pada database dan mengeksekusi ulang semua file migrasi kita bisa gunakan perintah berikut.

Terminal
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.