Selasa, 30 April 2019

Membuat Aplikasi Invoice Laravel 5.7 #1: Generate Database


Pendahuluan

Artikel ini bertujuan untuk membantu teman-teman dalam belajar dan memahami bagaimana menggunakan Laravel, pada artikel ini saya hanya akan menggunakan Laravel dalam berbagai sisi tanpa adanya stack tambahan yang akan diikut sertakan.

Membuat Struktur Database Dengan Migration


Laravel hadir dengan manajemen databasenya dengan menggunakan Migration, sehingga memudahkan kita dalam mengelola segala perubahan struktur database.
Adapun struktur database yang akan dibuat sejauh ini akan tampak seperti berikut, sedangkan perubahan struktur jika diperlukan akan dilakukan sepanjang seri artikel ini.
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 managment-invoice

Setelah meng-Install kemudian masuk ke project kalian dengan command :

cd /xampp/htdocs/managment-invoice/

Generate model CustomerProductInvoice 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-Generatefile tersebut berada dalam folderdatabase/migrations. Pertama buka file migration daricustomerkemudian 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 dariproductskemudian 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')->unique();

            $table->timestamps();

        });

    }


     /**

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()

    {

        Schema::dropIfExists('product');

    }

}


Kemudian migration dariinvoices:


 
<?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 dariinvoice_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.envyang terletak di luar folder pada bagian :

DB_CONNECTION = mysql
	
DB_HOST = 127.0.0.1
	
DB_PORT = 3306
	
DB_DATABASE = nama_database_kalian 

DB_USERNAME = user_database_kalian

DB_PASSWORD = password_database_kalian

Lalu jalankan command 


php artisan migrate

Apabila disaat melakukan perintah migrate error / tidak success tambahkan code di app/provider/AppServiceProvider


public function boot()
    {
        Schema::defaultStringLength(191);
    }

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 tableproducts 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:customers ->invoicesdanproducts<-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::create('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::create('invoice_details', function (Blueprint $table) {

            $table->foreign('invoice_id')

            ->references('id')->on('invoices')

            ->onDelete('cascade'); //CASCADE berarti apabila data induk berubah maka data anak juga akan berubah<

            $table->foreign('product_id')

            ->references('id')->on('products')

            ->onDelete('cascade'); //CASCADE berarti apabila data induk berubah maka data anak juga akan berubah<

        });

    }


     /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()

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

Tidak ada komentar:

Posting Komentar