My Course — Membangun Website Food Store Dengan Laravel Filament, Livewire dan Payment Gateway

Membuat Model dan Migration


Pada bab Perancangan kita telah melihat beberapa informasi terkait struktur table beserta relasinya dan pada materi saat ini, kita akan coba mengimplementasikannya di dalam Laravel.

Langkah 1 - Membuat Model dan Migration Category

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:model Category -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Category.php
  2. database/migrations/2024_11_19_010532_create_categories_table.php

INFORMASI : untuk nama file migration akan random sesuai tanggal pembuatannya.

  • Menambahkan Field

    Setelah berhasil melakukan generate Model dan Migration, maka kita akan lanjutkan menambahkan sebuah field / attribute di dalam file migrasinya.

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_010532_create_categories_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('categories', function (Blueprint $table) { $table->id(); $table->string('image'); $table->string('name'); $table->string('slug'); $table->timestamps(); }); }

    Pada perubahan di atas, kita menambahkan 3 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    image string - untuk menyimpan nama gambar.
    name string - untuk menyimpan nama category.
    slug string - untuk menyimpan slug category.
  • Menambahkan Mass Assignment

    Setelah berhasil menambahkan field di dalam file migration, maka langkah selanjutnya adalah menambahkan Mass Assignment di dalam Model Category. Ini bertujuan untuk mengizinkan field-field yang sudah kita tambahkan di atas dapat melakukan proses insert data ke dalam database.

    Silahkan buka file app/Models/Category.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Category extends Model { /** * fillable * * @var array */ protected $fillable = ['image', 'name', 'slug']; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Properti tersebut bisa juga disebut dengan Mass Assigment.

Langkah 2 - Membuat Model dan Migration Product

Kita lanjutkan membuat Model dan Migration untuk data Product, sekarang silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:model Product -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Product.php
  2. database/migrations/2024_11_19_011349_create_products_table.php
  • Menambahkan Field

    Setelah berhasil melakukan generate Model dan Migration, maka kita akan lanjutkan menambahkan sebuah field / attribute di dalam file migrasinya.

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_011349_create_products_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('products', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('category_id'); $table->string('image'); $table->string('title'); $table->string('slug'); $table->text('description'); $table->integer('price'); $table->integer('weight'); $table->timestamps(); // Define the foreign key relationship $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 3 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    category_id unsignedBigInteger foreign key untuk membuat relasi ke table categories.
    image string - untuk menyimpan nama gambar.
    title string - untuk menyimpan nama product.
    slug string - untuk menyimpan slug product.
    description text - untuk menyimpan keterangan product.
    price integer - untuk menyimpan harga product.
    weight integer - untuk menyimpan berat product.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Product. Silahkan buka file app/Models/Product.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Product extends Model { /** * fillable * * @var array */ protected $fillable = [ 'category_id', 'image', 'title', 'slug', 'description', 'price', 'weight' ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 3 - Membuat Model dan Migration Customer

Setelah berhasil membuat Model dan Migration untuk data Category dan Product, maka kita akan lanjutkan belajar membuat Model dan Migration untuk data Customer.

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:model Customer -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Customer.php
  2. database/migrations/2024_11_19_012550_create_customers_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_012550_create_customers_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    scss
    public function up(): void { Schema::create('customers', function (Blueprint $table) { $table->id(); $table->string('image')->nullable(); $table->string('name'); $table->string('email'); $table->string('password'); $table->timestamps(); }); }

    Pada perubahan di atas, kita menambahkan 4 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    image string nullable untuk menyimpan nama gambar dan tidak wajib diisi.
    name string - untuk menyimpan nama customer.
    email string - untuk menyimpan email customer.
    password string - untuk menyimpan password customer.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Customer. Silahkan buka file app/Models/Customer.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Customer extends Model { /** * fillable * * @var array */ protected $fillable = [ 'image', 'name', 'email', 'password' ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 4 - Membuat Model dan Migration Cart

Kita lanjutkan membuat Model dan Migration untuk data Cart, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:model Cart -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Cart.php
  2. database/migrations/2024_11_19_014036_create_carts_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_014036_create_carts_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('carts', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('customer_id'); $table->unsignedBigInteger('product_id'); $table->integer('qty'); $table->timestamps(); $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 3 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    customer_id unsignedBigInteger foreign key untuk membuat relasi ke table customers.
    product_id unsignedBigInteger foreign key untuk membuat relasi ke table products.
    qty integer - untuk menyimpan quantity.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Cart. Silahkan buka file app/Models/Cart.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Cart extends Model { /** * fillable * * @var array */ protected $fillable = [ 'customer_id', 'product_id', 'qty' ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 5 - Membuat Model dan Migration Province

Sekarang kita akan membuat Model dan Migration untuk data Province, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.

go
php artisan make:model Province -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Province.php
  2. database/migrations/2024_11_19_021407_create_provinces_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_021407_create_provinces_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('provinces', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); }

    Pada perubahan di atas, kita menambahkan 1 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    name string - untuk menyimpan nama province.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Province. Silahkan buka file app/Models/Province.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Province extends Model { /** * fillable * * @var array */ protected $fillable = [ 'name' ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field yang kita tambahkan sebelumnya.

Langkah 6 - Membuat Model dan Migration City

Setelah berhasil membuat untuk data Province, maka kita lanjutkan untuk City-nya, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.

go
php artisan make:model City -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/City.php
  2. database/migrations/2024_11_19_021950_create_cities_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_021950_create_cities_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('cities', function (Blueprint $table) { $table->id(); $table->string('name'); $table->unsignedBigInteger('province_id'); $table->timestamps(); $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 2 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    name string - untuk menyimpan nama city.
    province_id unsignedBigInteger foreign key untuk membuat relasi ke table provinces.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model City. Silahkan buka file app/Models/City.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class City extends Model { /** * fillable * * @var array */ protected $fillable = [ 'name', 'province_id' ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field yang kita tambahkan sebelumnya.

Langkah 7 - Membuat Model dan Migration Transaction

Sekarang kita akan membuat Model dan Migration untuk data Transaction, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.

go
php artisan make:model Transaction -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Transaction.php
  2. database/migrations/2024_11_19_025546_create_transactions_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_025546_create_transactions_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('transactions', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('customer_id'); $table->unsignedBigInteger('province_id'); $table->unsignedBigInteger('city_id'); $table->string('invoice'); $table->integer('weight'); $table->text('address'); $table->decimal('total', 8, 2); $table->enum('status', ['pending', 'success', 'expired', 'failed'])->default('pending'); $table->string('snap_token')->nullable(); $table->timestamps(); $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade'); $table->foreign('city_id')->references('id')->on('cities')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 9 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    customer_id unsignedBigInteger foreign key untuk membuat relasi ke table customers.
    province_id unsignedBigInteger foreign key untuk membuat relasi ke table provinces.
    city_id unsignedBigInteger foreign key untuk membuat relasi ke table cities.
    invoice string - untuk menyimpan invoice.
    weight integer - untuk menyimpan berat.
    address text - untuk menyimpan alamat.
    total decimal - untuk menyimpan total belanja.
    status enum - untuk menyimpan status pesanan.
    snap_token string - untuk menyimpan snap token dari Midtrans.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Transaction. Silahkan buka file app/Models/Transaction.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Transaction extends Model { /** * fillable * * @var array */ protected $fillable = [ 'customer_id', 'shipping_id', 'province_id', 'city_id', 'invoice', 'weight', 'address', 'total', 'status', 'snap_token', ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 8 - Membuat Model dan Migration Transaction Detail

Transaction Detail merupakan table yang berisi item-item atau product-product yang dibeli dalam satu transaksi. Sehingga nanti dalam satu transaksi akan memiliki banyak item-tem di dalamnya.

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.

go
php artisan make:model TransactionDetail -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/TransactionDetail.php
  2. database/migrations/2024_11_19_030448_create_transaction_details_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_030448_create_transaction_details_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('transaction_details', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('transaction_id'); $table->unsignedBigInteger('product_id'); $table->integer('qty'); $table->integer('price'); $table->timestamps(); $table->foreign('transaction_id')->references('id')->on('transactions')->onDelete('cascade'); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 4 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    transaction_d unsignedBigInteger foreign key untuk membuat relasi ke table transactions.
    product_id unsignedBigInteger foreign key untuk membuat relasi ke table products.
    qty integer - untuk menyimpan quantity.
    price integer - untuk menyimpan harga.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model TransactionDetail. Silahkan buka file app/Models/TransactionDetail.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class TransactionDetail extends Model { /** * fillable * * @var array */ protected $fillable = [ 'transaction_id', 'product_id', 'qty', 'price', ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 9 - Membuat Model dan Migration Shipping

Table ini nantinya akan kita gunakan untuk menyimpan data pengiriman yang terkait dengan sebuah transaksi.

Silahkan jalankan perintah berikut ini di dalam terminal/CMD dan pastikan berada di dalam project Laravel-nya.

go
php artisan make:model Shipping -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Shipping.php
  2. database/migrations/2024_11_19_032035_create_shippings_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_032035_create_shippings_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('shippings', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('transaction_id'); $table->string('shipping_courier'); $table->string('shipping_service'); $table->decimal('shipping_cost', 8, 2); $table->timestamps(); $table->foreign('transaction_id')->references('id')->on('transactions')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 4 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    transaction_d unsignedBigInteger foreign key untuk membuat relasi ke table transactions.
    shipping_courier string - untuk menyimpan nama kurir.
    shipping_service string - untuk menyimpan layanan kurir.
    shipping_cost decimal - untuk menyimpan harga pengiriman.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Shipping. Silahkan buka file app/Models/Shipping.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Shipping extends Model { /** * fillable * * @var array */ protected $fillable = ['shipping_courier', 'shipping_service', 'shipping_cost', 'transaction_id']; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 10 - Membuat Model dan Migration Rating

Kita lanjutkan membuat Model dan Migration untuk data Rating, silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD.

go
php artisan make:model Rating -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Rating.php
  2. database/migrations/2024_11_19_033129_create_ratings_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_033129_create_ratings_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    php
    public function up(): void { Schema::create('ratings', function (Blueprint $table) { $table->id(); $table->unsignedBigInteger('transaction_detail_id'); $table->unsignedBigInteger('customer_id'); $table->unsignedBigInteger('product_id'); $table->integer('rating'); $table->text('review'); $table->timestamps(); $table->foreign('transaction_detail_id')->references('id')->on('transaction_details')->onDelete('cascade'); $table->foreign('customer_id')->references('id')->on('customers')->onDelete('cascade'); $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade'); }); }

    Pada perubahan di atas, kita menambahkan 5 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    transaction_detail_id unsignedBigInteger foreign key untuk membuat relasi ke table transaction_details.
    customer_id unsignedBigInteger foreign key untuk membuat relasi ke table customers.
    product_id unsignedBigInteger foreign key untuk membuat relasi ke table products.
    rating integer - untuk menyimpan jumlah rating.
    review string - untuk menyimpan review.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Rating. Silahkan buka file app/Models/Rating.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Rating extends Model { /** * fillable * * @var array */ protected $fillable = [ 'customer_id', 'product_id', 'transaction_detail_id', 'rating', 'review', ]; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.

Langkah 11 - Membuat Model dan Migration Slider

Terakhir, kita akan membuat Model dan Migration untuk data Slider, silahkan jalankan perintah berikut ini di dalam terminal/CMD.

go
php artisan make:model Slider -m

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. app/Models/Slider.php
  2. database/migrations/2024_11_19_033740_create_sliders_table.php
  • Menambahkan Field

    Silahkan teman-teman buka file migrationnya yang berada di dalam folder database/migrations/2024_11_19_033740_create_sliders_table.php, kemudian pada bagian function up ubah menjadi seperti berikut ini.

    scss
    public function up(): void { Schema::create('sliders', function (Blueprint $table) { $table->id(); $table->string('image'); $table->string('link')->nullable(); $table->timestamps(); }); }

    Pada perubahan di atas, kita menambahkan 4 field, yaitu:

    ATTRIBUTE TYPE DATA OPTIONS DESCRIPTION
    image string - untuk menyimpan nama gambar.
    link string nullable untuk menyimpan link slider dan tidak wajib diisi.
  • Menambahkan Mass Assignment

    Selanjutnya adalah menambahkan Mass Assignment di dalam Model Slider. Silahkan buka file app/Models/Slider.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

    php
    <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Slider extends Model { /** * fillable * * @var array */ protected $fillable = ['image', 'link']; }

    Dari perubahan kode di atas, kita menambahkan properti yang bernama $fillable. Di dalamnya berisi field-field yang kita tambahkan sebelumnya.