~ We are changing the world with technology. ~

Matt Mullenweg

Membuat Aplikasi Invoice Laravel 5.7 #1: Generate Database

Membuat Aplikasi Invoice Laravel 5.7 #1: Generate Database

5126 Dilihat

Pendahuluan

Seri terbaru dalam memahami bagaimana cara menggunakan Laravel adalah dengan mencoba berbagai macam case untuk membiasakan diri dalam menyelesaikan sebuah aplikasi. Meski hampir serupa dengan serial Membuat Aplikasi POS (Point of sales), namun case kali ini sedikit lebih sederhana karena hanya berpusat pada sebuah fitur untuk men-generate invoice.

Artikel ini bertujuan untuk membantu teman-teman dalam belajar dan memahami bagaimana menggunakan Laravel, sehingga berbeda dari seri sebelumnya dimana kita menggunakan Vue.js sebagai stack tambahan, pada artikel ini kita akan hanya akan menggunakan Laravel dalam berbagai sisi tanpa adanya stack tambahan yang akan diikut sertakan.

Baca Juga: Membuat Aplikasi POS (Point of Sales) Laravel 5.6 - Schema Database

Membuat Struktur Database Dengan Migration

Laravel hadir dengan manajemen databasenya dengan menggunakan Migration, sehingga memudahkan kita dalam mengelola segala perubahan struktur database. Dalam artikel, Migration, fitur ajaib di Laravel telah dibahas bagaimana cara migration itu sendiri bekerja.

Adapun struktur database yang akan dibuat sejauh ini akan tampak seperti berikut, sedangkan perubahan struktur jika diperlukan akan dilakukan sepanjang seri artikel ini.

laravel invoice app

Sejak artikel ini ditulis, Laravel yang akan digunakan adalah versi 5.7 yang merupakan versi terbaru saat ini. Install terlebih dahulu dengan command:

composer create-project --prefer-dist laravel/laravel daengweb-invoice

Generate model Customer, Product, Invoice dan Invoice_detail beserta migration-nya dengan command:

php artisan make:model Customer -m
php artisan make:model Product -m
php artisan make:model Invoice -m
php artisan make:model Invoice_detail -m

Buka masing-masing file migration yang telah di-generate, file tersebut diletakkan ke dalam folder database/migrations. Pertama buka file migration dari customer kemudian tambahkan code berikut:

<?php

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

class CreateCustomersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('customers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('phone');
            $table->string('address');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }

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

Selanjutnya buka file migration dari products kemudian tambahkan code berikut:

<?php

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

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('description');
            $table->integer('price');
            $table->integer('stock');
            $table->timestamps();
        });
    }

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

Kemudian migration dari invoices:

<?php

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

class CreateInvoicesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoices', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('customer_id');
            $table->boolean('status')->default(false);
            $table->string('note')->nullable();
            $table->integer('total');
            $table->timestamps();
        });
    }

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

Dan terakhir adalah migration dari invoice_details, kemudian lakukan perubahan menjadi:

<?php

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

class CreateInvoiceDetailsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoice_details', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('invoice_id');
            $table->unsignedInteger('product_id');
            $table->integer('price');
            $table->integer('qty');
            $table->timestamps();
        });
    }

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

Jangan lupa untuk menyesuaikan informasi database dengan memodifikasi file .env pada bagian:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database_kamu
DB_USERNAME=user_db_kamu
DB_PASSWORD=password_db_kamu

Lalu jalankan command:

php artisan migrate

Baca Juga: Mudah Membuat Fitur Register Dan Login Pada Laravel 5.4

Relasi Antar Table

Keterkaitan antar table sangat penting untuk mengefisienkan struktur data sehingga dalam mengelola data tersebut menjadi lebih mudah, maka hindari menuliskan property / field yang berulang dengan fungsi dan tujuan yang sama pada table yang berbeda.

Mungkin saja akan terdapat pertanyaan, tapi kok struktur database diatas terdapat field price yang sama antara table products dan invoice_details? Kenapa tidak menggunakan property yang ada di table products saja?

Hal ini kita lakukan karena apabila terjadi perubahan harga pada data master, dalam hal ini adalah table products tidak akan mempengaruhi harga yang sudah masuk ke dalam table invoice_details sebelumnya. Sehingga harga yang tercatat adalah harga saat terjadi transaksi.

Dari struktur database yang telah dibuat sebelumnya, terdapat 4 buah table yang saling terkait, yakni: customer -> invoices dan products <- invoice_details -> invoices. Buat migration untuk menghubungkan table tersebut dengan command:

php artisan make:migration add_relationships_to_invoices_table

Kemudian buka file tersebut, lalu tambahkan code berikut yang berfungsi untuk menghubungkan table customers dan table invoices:

<?php

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

class AddRelationshipsToInvoicesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('invoices', function (Blueprint $table) {
            $table->foreign('customer_id')
                ->references('id')->on('customers')
                ->onDelete('cascade'); //CASCADE berarti apabila data induk berubah maka data anak juga akan berubah
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('invoices', function (Blueprint $table) {
            $table->dropForeign('invoices_customer_id_foreign');
        });
    }
}

File migration selanjutya untuk membuat relasi antara table products, invoice_details dan invoices, generate migration-nya dengan command:

php artisan make:migration add_relationships_to_invoice_details_table

Lalu modifikasi migration tersebut menjadi:

<?php

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

class AddRelationshipsToInvoiceDetailsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('invoice_details', function (Blueprint $table) {
            $table->foreign('invoice_id')
                ->references('id')->on('invoices')
                ->onDelete('cascade');
            $table->foreign('product_id')
                ->references('id')->on('products')
                ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //FUNGSI INI UNTUK MENGHAPUS FOREIGN KEY ANTAR TABLE
        Schema::table('invoice_details', function (Blueprint $table) {
            $table->dropForeign('invoice_details_invoice_id_foreign');
            $table->dropForeign('invoice_details_product_id_foreign');
        });
    }
}

Terakhir, jalankan command:

php artisan migrate

Kesimpulan

Database menjadi kunci yang sangat penting untuk aplikasi berbasis data, sehingga struktur database yang baik akan memudahkan kamu dalam mengelolanya baik saat aplikasi tersebut di-develop ataupun ketika mengalami pengembangan. Sepanjang artikel ini kita telah belajar bagaimana membuat database dengan memanfaatkan fitur Migration dari Laravel, dan tidak hanya itu kita juga telah belajar membuat relasi antar table dengan menerapkan event onDelete dengan value cascade.

Adapun dokumentasi dari code serial membuat aplikasi invoice dapat kamu lihat di Github.

Backend Developer iTechShark, salah satu perusahaan asal Amerika. Senang dengan teknologi baru. Laravel addict yang tidak fanatik. Merekam jejak dengan menulis

Aplikasi Laundry (Laravel 5.8 - Vue.js - SPA) #3: Management Outlets Laravel VueJS

Aplikasi Laundry (Laravel 5.8 - Vue.js -...

Salah satu module yang pertama kali akan dikerjakan adalah module dengan table yang tidak bergantung dengan table lainnya, maka dalam serial ke-3 ini kita akan menyelesaikan module management outlets,...

Aplikasi Laundry (Laravel 5.8 - Vue.js - SPA) #2: Templating & Authentication Laravel VueJS

Aplikasi Laundry (Laravel 5.8 - Vue.js -...

Sebagai sebuah aplikasi internal antar pemilik laundry dan pengelola usaha, maka dibutuhkan halaman untuk proses otentikasi, maka pada artikel ini akan membahas bagaimana membuat authentication menggu...

Aplikasi Laundry (Laravel 5.8 - Vue.js - SPA) #1: Schema Database Laravel

Aplikasi Laundry (Laravel 5.8 - Vue.js -...

Beragam method yang digunakan untuk membuat sebuah aplikasi sesuai dengan yang diinginkan, salah satunya menggunakan SPA. Dalam tutorial ini kita akan belajar bagaimana membuat aplikasi laundry menggu...

Komentar