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! 🔨
Apa yang akan kita buat?
Kita akan membuat 4 tabel (penyimpanan data) beserta model dan relasinya:
| Nama Tabel | Fungsi |
|---|---|
roles | Menyimpan jenis pengguna: Admin, Petugas, Nasabah |
users | Data semua pengguna (nama, email, password, role_id) |
accounts | Rekening tabungan nasabah (no_rekening, saldo, user_id) |
transactions | Catatan 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');.
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');
}
}
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.
.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!