Tutorial Laravel & ReactJS #2: Database & Model Tabungan Bank

Tutorial #2: Membangun Database dan Model untuk Sistem Tabungan

Halo calon arsitek database! Hari ini kita akan membangun rumah untuk uang virtual para nasabah. Siapkan palu dan kode! 🔨

😂 Joke buat anak SD: "Kenapa database suka dipuji? Soalnya dia relational, punya banyak relasi, kayak orang punya banyak teman!" 🤝

Apa yang akan kita buat?

Kita akan membuat 4 tabel (penyimpanan data) beserta model dan relasinya:

Nama TabelFungsi
rolesMenyimpan jenis pengguna: Admin, Petugas, Nasabah
usersData semua pengguna (nama, email, password, role_id)
accountsRekening tabungan nasabah (no_rekening, saldo, user_id)
transactionsCatatan nabung/ambil (tipe, jumlah, keterangan, id petugas)

Relasinya: Role punya banyak User (one to many), User punya satu Account (one to one), Account punya banyak Transaction (one to many), dan Transaction dibuat oleh satu Petugas (User).

Langkah 1: Buat Migration untuk Tabel Roles

Buka terminal, masuk ke folder bank-backend. Jalankan perintah artisan untuk membuat migration:

php artisan make:migration create_roles_table

File migration akan muncul di database/migrations/xxxx_xx_xx_xxxxxx_create_roles_table.php. Buka file itu, lalu isi method up() dengan kode berikut:

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->id();
        $table->string('name'); // contoh: admin, petugas, nasabah
        $table->timestamps();
    });
}

Method down() isinya Schema::dropIfExists('roles'); biar kalau migrasi di-rollback, tabelnya kehapus.

Langkah 2: Modifikasi Migration Users yang Sudah Ada

Laravel secara default sudah menyediakan migration untuk tabel users. Kita tinggal menambahkan kolom role_id. Buka file migration users (nama filenya xxxx_xx_xx_000000_create_users_table.php). Di dalam method up(), tambahkan baris berikut setelah $table->string('password');:

$table->unsignedBigInteger('role_id')->default(3); // default nasabah

Lalu tambahkan juga foreign key agar terhubung ke tabel roles. Setelah semua kolom, tambahkan:

$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

Jangan lupa, di method down() kita harus hapus foreign key dulu sebelum drop tabel. Biasanya ditambahkan: $table->dropForeign(['role_id']); lalu $table->dropColumn('role_id');.

💡 Tips: Kalau bingung urusan foreign key, bayangin aja kayak kita kasih tanda pengenal bahwa setiap user punya peran (role). Tanda ini nyambung ke tabel roles.

Langkah 3: Buat Migration Tabel Accounts (Tabungan)

Jalankan perintah:

php artisan make:migration create_accounts_table

Isi file migration tersebut:

public function up()
{
    Schema::create('accounts', function (Blueprint $table) {
        $table->id();
        $table->string('account_number')->unique(); // no rekening unik
        $table->decimal('balance', 15, 2)->default(0); // saldo, 15 digit total, 2 desimal
        $table->unsignedBigInteger('user_id'); // pemilik rekening
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

Jangan lupa down() diisi Schema::dropIfExists('accounts');.

Langkah 4: Buat Migration Tabel Transactions

php artisan make:migration create_transactions_table

Isi migration:

public function up()
{
    Schema::create('transactions', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('account_id'); // rekening yang bertransaksi
        $table->enum('type', ['debit', 'kredit']); // debit = setor, kredit = tarik
        $table->decimal('amount', 15, 2);
        $table->text('description')->nullable(); // keterangan, misal "Setor tunai"
        $table->unsignedBigInteger('petugas_id'); // id petugas yang memproses (dari tabel users)
        $table->timestamps();

        $table->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');
        $table->foreign('petugas_id')->references('id')->on('users');
    });
}

Langkah 5: Membuat Model dan Relasi

Kita sudah punya model User.php bawaan Laravel. Sekarang buat model lain.

Model Role

Buat dengan perintah:

php artisan make:model Role

Buka file app/Models/Role.php (atau app/Role.php tergantung versi Laravel). Isi relasi:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    protected $fillable = ['name'];

    public function users()
    {
        return $this->hasMany(User::class);
    }
}

Model User (tambah relasi)

Buka app/Models/User.php, tambahkan:

public function role()
{
    return $this->belongsTo(Role::class);
}

public function account()
{
    return $this->hasOne(Account::class);
}

// Relasi untuk transaksi yang diproses oleh petugas
public function processedTransactions()
{
    return $this->hasMany(Transaction::class, 'petugas_id');
}

Jangan lupa tambahkan role_id ke $fillable atau $guarded di model User.

Model Account

Buat model Account:

php artisan make:model Account

Isi app/Models/Account.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Account extends Model
{
    protected $fillable = ['account_number', 'balance', 'user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function transactions()
    {
        return $this->hasMany(Transaction::class);
    }
}

Model Transaction

php artisan make:model Transaction

Isi app/Models/Transaction.php:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Transaction extends Model
{
    protected $fillable = ['account_id', 'type', 'amount', 'description', 'petugas_id'];

    public function account()
    {
        return $this->belongsTo(Account::class);
    }

    public function petugas()
    {
        return $this->belongsTo(User::class, 'petugas_id');
    }
}
😆 "Kenapa model suka bingung? Karena dia harus extends ke sana kemari, kayak karet!" (Model di Laravel memang harus extends kelas Model, biar punya banyak method sakti)

Langkah 6: Menjalankan Migrasi dan Seeder (Isi Data Awal)

Sebelum migrasi, kita perlu mengisi tabel roles dengan data: Admin, Petugas, Nasabah. Buat seeder:

php artisan make:seeder RoleSeeder

Buka database/seeders/RoleSeeder.php, isi:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Role;

class RoleSeeder extends Seeder
{
    public function run()
    {
        Role::create(['name' => 'Admin']);
        Role::create(['name' => 'Petugas']);
        Role::create(['name' => 'Nasabah']);
    }
}

Kemudian panggil seeder ini di DatabaseSeeder.php:

public function run()
{
    $this->call(RoleSeeder::class);
}

Sekarang jalankan migrasi dan seeder sekaligus:

php artisan migrate --seed

Kalau berhasil, tabel-tabel akan terbuat dan tiga baris di tabel roles terisi.

🎯 Catatan: Migrasi akan membuat struktur tabel. Seeder mengisi data awal. Jangan lupa pastikan koneksi database sudah benar di file .env.

Langkah 7: Uji Coba dengan Tinker

Kita bisa cek apakah relasi berfungsi menggunakan Laravel Tinker (seperti terminal interaktif). Jalankan:

php artisan tinker

Lalu coba buat user baru dengan role_id = 3 (nasabah):

$user = new App\Models\User();
$user->name = 'Budi';
$user->email = 'budi@mail.com';
$user->password = bcrypt('123456');
$user->role_id = 3;
$user->save();

Buat rekening untuk user tersebut:

$account = new App\Models\Account();
$account->account_number = 'REK' . time();
$account->user_id = $user->id;
$account->balance = 50000;
$account->save();

Sekarang cek relasi: $user->account harus mengembalikan data rekening. Begitu juga $account->user mengembalikan data Budi. Mantap!

Kesimpulan

Kita sudah berhasil:

  • ✅ Membuat migration untuk roles, users (modifikasi), accounts, transactions.
  • ✅ Mendefinisikan model dan relasi one-to-many, one-to-one.
  • ✅ Menambahkan foreign key constraints.
  • ✅ Mengisi data awal roles dengan seeder.
  • ✅ Menguji relasi dengan tinker.

Di tutorial selanjutnya (#3: Autentikasi Multi-Level dengan Laravel Sanctum) kita akan membuat sistem login untuk Admin, Petugas, dan Nasabah menggunakan token. Siapkan minuman dan cemilan, karena akan ada banyak kode seru! 

Lebih baru Lebih lama

نموذج الاتصال