(Part 1) Membuat Aplikasi POS (Point of Sales) Laravel 5.6 - Schema Database

(Part 1) Membuat Aplikasi POS (Point of Sales) Laravel 5.6 - Schema Database

Pendahuluan

Dalam workshop yang telah diselenggarakan oleh Daengweb.id (26-27 Mei 2018), kami mengangkat study kasus POS (Point of Sales) yang akan memaksa peserta untuk memahami bagaimana tahapan dalam membangun sebuah aplikasi. Hal ini tentu saja dilatara belakangi, karena banyak orang yang tiada henti belajar basic pemrograman namun tidak mampu merangkainya sehingga menjadi sebuah aplikasi. Namun, tidak berarti harus dikesampingkan untuk tidak belajar basic terlebih dahulu, sebab keduanya saling terkait satu sama lain.

Tahapan dalam membangun sebuah aplikasi adalah dengan melihat kasus yang akan diangkat menjadi sebuah masalah besar yang kemudian nantinya akan dipecah menjadi masalah-masalah kecil, lalu diikuti dengan penyelesaian terhadap masalah-masalah kecil tersebut.

Maka sebelum memulainya, mari kita lihat pokok masalahnya terlebih dahulu: Point of Sales, yang berarti akan terjadi proses pencatatan transaksi penjualan, maka syarat dari pencatatan transaksi tersebut adalah terdapat data produk yang telah dikelompokkan berdasarkan kategori agar lebih rapi dan lebih mudah diidentifikasi, data customer, data operator (admin) dan proses pencatatan antara customer yang membeli produk apa saja nantinya.

Baca Juga: Reusable With Blade Component Laravel

Schema Database

Setalah kita mendapati gambaran aplikasi yang akan dibuat, maka mari kita coba mengkonversinya menjadi sebuah schema database yang nantinya akan digunakan untuk menyimpan semua data yang diperlukan.

Membuat Aplikasi POS

Membuat Migration Database

Sub topik ini sudah pernah dibahas dalam materi Migration, Fitur Ajaib di Laravel. So, buat yang masih bingung kegunaan dari migration ini, silahkan baca dulu artikel sebelumya.

Tahap pertama, buat migration untuk table categories terlebih dahulu sekaligus dengan model-nya, jadi kita hanya perlu menggunakan command make​::model kemudian diikuti dengan flag -m, yang berarti sekaligus akan meng-generate migration-nya.

php artisan make:model Category -m

Buka file migration untuk category yang dapat kamu temukan pada direktori database/migrations, kemudian lakukan modifikasi menjadi seperti ini:

...
​
public function up()
{
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('description')->nullable();
        $table->timestamps();
    });
}
    
...

Selanjutnya buat migration untuk products:

php artisan make:model Product -m

Kemudian modifikasi kembali migration untuk products:

...
    
public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('description')->nullable();
        $table->string('stock');
        $table->string('price');
        $table->integer('category_id');
        $table->timestamps();
    });
}
​
...

Penjelasan: Terdapat field category_id yang nantinya akan digunakan untuk membuat relasi ke table categories

Karena table users secara default migration-nya sudah disediakan oleh Laravel dan untuk case kali ini, kita tidak akan melakukan perubahan untuk table users. Jadi, melangkah ke table selanjutnya, buat migration untuk table customers:

php artisan make:model Customer -m

Modifikasi migration untuk customers:

...
​
public function up()
{
    Schema::create('customers', function (Blueprint $table) {
        $table->increments('id');
        $table->string('email')->unique();
        $table->string('name');
        $table->text('address');
        $table->string('phone');
        $table->timestamps();
    });
}
    
...

Table selanjutnya adalah orders:

php artisan make:model Order -m

Migration-nya menjadi:

...
​
public function up()
{
    Schema::create('orders', function (Blueprint $table) {
        $table->increments('id');
        $table->string('invoice')->unique();
        $table->integer('customer_id');
        $table->integer('user_id');
        $table->integer('total');
        $table->timestamps();
    });
}
​
...

Table terakhir yang dibutuhkan adalah order_details:

php artisan make:model Order_detail -m

Migration-nya menjadinya:

public function up()
{
    Schema::create('order_details', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('order_id');
        $table->integer('product_id');
        $table->integer('qty');
        $table->integer('price');
        $table->timestamps();
    });
}

Kok table-nya belum ada di database? karena belum di migrate, jalankan command berikut:

php artisan migrate

Ohya, jangan lupa untuk mengisi informasi koneksi database kamu dengan memodifikasi file .env.

Membuat Relasi Database

Seperti yang kamu lihat pada screenshoot sebelumnya, terdapat garis yang menghubungkan antara table yang berelasi. Sebenarnya, bisa saja kita sematkan pada migration sebelumnya. Namun, sengaja saya pisahkan agar lebih mudah menjelaskannya.

Buat migration baru dengan command:

php artisan make:migration add_relationships_to_products_table

Note: Sebenarnya nama migration-nya bebas, tapi sebaiknya mewakili apa yang akan dilakukan oleh migration tersebut agar lebih mudah diidentifikasi.

Method Up, modifikasi menjadi:

...
​
public function up()
{
    Schema::table('products', function (Blueprint $table) {
        $table->integer('category_id')->unsigned()->change();
        $table->foreign('category_id')->references('id')->on('categories')
                ->onUpdate('cascade')->onDelete('cascade');
    });
}
    
...

Penjelasan: Agar field category_id dapat dijadikan foreign key, maka perlu kita ubah menjadi unsigned(). Kita buat cascade saja agar ketika records pada table categories dihapus, maka child atau row yang menggunakan category_id tersebut pada table products akan ikut terhapus / update.

Masih dalam file migration yang sama, pada method Down modifikasi menjadi:

...
​
public function down()
{
    Schema::table('products', function(Blueprint $table) {
        $table->dropForeign('products_category_id_foreign');
    });
​
    Schema::table('products', function(Blueprint $table) {
        $table->dropIndex('products_category_id_foreign');
    });
​
    Schema::table('products', function(Blueprint $table) {
        $table->integer('category_id')->change();
    });
}
​
...

Penjelasan: Method down ini akan menghapus relasi antar table yang dimaksud, dimana method dropForeign menerima format table_field_foreign sehingga pada kasus ini menjadi products_category_id_foreign. Begitupun dropIndex untuk menghapus index yang telah dibuat, format yang diterima pun sama. Lalu terakhir mengembalikannya menjadi integer seperti semula.

Dengan begini, maka table categories dan products telah terhubung. Maka hal yang sama dapat dilakukan pada table lain, dimana, jika kita lihat table orders berelasi dengan table customers dan users. Buat migration-nya dengan command:

php artisan make:migration add_relationships_to_orders_table

Kemudian modifikasi menjadi:

public function up()
{
    Schema::table('orders', function (Blueprint $table) {
        $table->integer('customer_id')->unsigned()->change();
        $table->foreign('customer_id')->references('id')->on('customers')
            ->onUpdate('cascade')->onDelete('cascade');
            
        $table->integer('user_id')->unsigned()->change();
        $table->foreign('user_id')->references('id')->on('users')
            ->onUpdate('cascade')->onDelete('cascade');
    });
}
​
public function down()
{
    Schema::table('orders', function(Blueprint $table) {
        $table->dropForeign('orders_customer_id_foreign');
    });
​
    Schema::table('orders', function(Blueprint $table) {
        $table->dropIndex('orders_customer_id_foreign');
    });
​
    Schema::table('orders', function(Blueprint $table) {
        $table->integer('customer_id')->change();
    });
​
    Schema::table('orders', function(Blueprint $table) {
        $table->dropForeign('orders_user_id_foreign');
    });
​
    Schema::table('orders', function(Blueprint $table) {
        $table->dropIndex('orders_user_id_foreign');
    });
​
    Schema::table('orders', function(Blueprint $table) {
        $table->integer('user_id')->change();
    });
}

Yang terakhir adalah membuat relasi dengan table order_details:

php artisan make:migration add_relationships_to_order_details_table

Modifikasi menjadi:

public function up()
{
    Schema::table('order_details', function(Blueprint $table) {
        $table->integer('order_id')->unsigned()->change();
        $table->foreign('order_id')->references('id')->on('orders')
            ->onUpdate('cascade')
            ->onDelete('cascade');
            
        $table->integer('product_id')->unsigned()->change();
        $table->foreign('product_id')->references('id')->on('products')
            ->onUpdate('cascade')
            ->onDelete('cascade');
    });
}
​
public function down()
{
    Schema::table('order_details', function(Blueprint $table) {
        $table->dropForeign('order_details_order_id_foreign');
    });
​
    Schema::table('order_details', function(Blueprint $table) {
        $table->dropIndex('order_details_order_id_foreign');
    });
​
    Schema::table('order_details', function(Blueprint $table) {
        $table->integer('order_id')->change();
    });
​
    Schema::table('order_details', function(Blueprint $table) {
        $table->dropForeign('order_details_product_id_foreign');
    });
​
    Schema::table('order_details', function(Blueprint $table) {
        $table->dropIndex('order_details_product_id_foreign');
    });
​
    Schema::table('order_details', function(Blueprint $table) {
        $table->integer('product_id')->change();
    });
}

Sebelum menjalankan command migrate, perlu untuk meng-install doctrine/dbal:

composer require doctrine/dbal

Kemudian:

php artisan migrate

Maka sampai pada tahap ini, relasi antar table telah dibuat.

Baca Juga: Cara Mudah Deploy Laravel ke VPS

Kesimpulan

Mengakhiri sesi ini, kita telah menyelesaikan schema database yang akan digunakan untuk membuat aplikasi Point of Sales, maka dengan schema database kita sudah dapat membayangkan dan juga mempetak-petakkan apa saja yang harus kita selesaikan nantinya dalam proses development.

Ohya, seluruh source code dalam artikel yang akan terus berkelanjutan ini akan kami dokumentasikan di Github

Category:
Share:

Comments