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