Skip to content

Eloquent Domain Models & Database Schema ​

1. Relational Database Schema ​

mermaid
erDiagram
    AcademicYear ||--o{ ClassModel : defines
    AcademicYear ||--o{ Member : tracks
    ClassModel ||--o{ Member : contains
    Member ||--o{ DataCorrection : submits
    Member ||--o{ AuditLog : generates
    PortalApp ||--o{ ApiKey : integrates

2. Comprehensive MariaDB Table Schema ​

2.1 Members Table (members) ​

Stores central user identities across all school roles.

sql
CREATE TABLE `members` (
    `id` CHAR(36) PRIMARY KEY,
    `nama` VARCHAR(255) NOT NULL,
    `role` ENUM('siswa', 'guru', 'tendik', 'alumni', 'keluar') NOT NULL DEFAULT 'siswa',
    `jenis_kelamin` ENUM('L', 'P') DEFAULT NULL,
    `nik` VARCHAR(16) DEFAULT NULL UNIQUE,
    `nisn` VARCHAR(10) DEFAULT NULL UNIQUE,
    `nip` VARCHAR(25) DEFAULT NULL UNIQUE,
    `tanggal_lahir` DATE NOT NULL,
    `kelas` VARCHAR(50) DEFAULT NULL,
    `academic_year_id` CHAR(36) DEFAULT NULL,
    `dapodik_id` VARCHAR(64) DEFAULT NULL,
    `google_id` VARCHAR(255) DEFAULT NULL UNIQUE,
    `google_email` VARCHAR(255) DEFAULT NULL,
    `is_claimed` TINYINT(1) NOT NULL DEFAULT 0,
    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT `fk_member_academic` FOREIGN KEY (`academic_year_id`) 
        REFERENCES `academic_years`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. Core Eloquent Models ​

3.1 Academic Year Model (app/Models/AcademicYear.php) ​

php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class AcademicYear extends Model
{
    protected $table = 'academic_years';
    protected $keyType = 'string';
    public $incrementing = false;

    protected $fillable = [
        'id', 'name', 'is_active'
    ];

    public function getActive()
    {
        return self::where('is_active', 1)->first();
    }
}