# Cara Guna Table `ref` dalam Form Lain

Table `ref` adalah **lookup/reference table** — digunakan untuk menyimpan senarai pilihan (dropdown) yang boleh dikongsi merentasi pelbagai modul dalam sistem.

---

## Struktur Data `ref`

| Column | Fungsi |
|--------|--------|
| `cat` | Kategori kumpulan (contoh: `STATUS`, `GENDER`, `NEGERI`) |
| `code` | Nilai yang disimpan dalam field lain (contoh: `ACTIVE`, `MALE`) |
| `descr` | Penerangan dalam Bahasa Malaysia |
| `descr_en` | Penerangan dalam Bahasa Inggeris |
| `sort` | Susunan dalam dropdown |
| `parent` | Untuk hierarchi (contoh: daerah di bawah negeri) |

**Contoh data dalam table:**

| cat | code | descr | descr_en | sort |
|-----|------|-------|----------|------|
| STATUS | ACTIVE | Aktif | Active | 1 |
| STATUS | INACTIVE | Tidak Aktif | Inactive | 2 |
| GENDER | MALE | Lelaki | Male | 1 |
| GENDER | FEMALE | Perempuan | Female | 2 |
| NEGERI | SGR | Selangor | Selangor | 1 |
| NEGERI | KL | Kuala Lumpur | Kuala Lumpur | 2 |

---

## Cara 1 — Pass dari Controller (Cara Paling Standard)

### Step 1: Dalam Controller

```php
use App\Models\Backend\Ref;

public function create()
{
    // pluck('descr', 'code') → ['ACTIVE' => 'Aktif', 'INACTIVE' => 'Tidak Aktif']
    $statuses = Ref::where('cat', 'STATUS')->orderBy('sort')->pluck('descr', 'code');
    $genders  = Ref::where('cat', 'GENDER')->orderBy('sort')->pluck('descr', 'code');

    return view('backend-user.module.someModule.create', compact('statuses', 'genders'));
}

// Buat benda yang sama untuk method edit()
public function edit($id)
{
    $record   = SomeModel::findOrFail($id);
    $statuses = Ref::where('cat', 'STATUS')->orderBy('sort')->pluck('descr', 'code');
    $genders  = Ref::where('cat', 'GENDER')->orderBy('sort')->pluck('descr', 'code');

    return view('backend-user.module.someModule.edit', compact('record', 'statuses', 'genders'));
}
```

### Step 2: Dalam Blade (create.blade.php / edit.blade.php)

```html
<!-- SELECT DROPDOWN - STATUS -->
<div>
    <label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-1.5">
        Status <span class="text-error-500">*</span>
    </label>
    <select name="status"
        class="w-full rounded-lg border bg-transparent px-4 py-2.5 text-sm text-gray-800
               focus:ring-3 focus:outline-hidden dark:bg-gray-900 dark:text-white/90
               border-gray-300 dark:border-gray-700">
        <option value="">-- Pilih Status --</option>
        @foreach($statuses as $code => $descr)
            <option value="{{ $code }}"
                {{ old('status', $record->status ?? '') == $code ? 'selected' : '' }}>
                {{ $descr }}
            </option>
        @endforeach
    </select>
    @error('status')
        <p class="text-theme-xs text-error-500 mt-1.5">{{ $message }}</p>
    @enderror
</div>

<!-- SELECT DROPDOWN - GENDER -->
<div>
    <label class="block text-sm font-medium text-gray-700 dark:text-gray-400 mb-1.5">
        Jantina
    </label>
    <select name="gender"
        class="w-full rounded-lg border bg-transparent px-4 py-2.5 text-sm text-gray-800
               focus:ring-3 focus:outline-hidden dark:bg-gray-900 dark:text-white/90
               border-gray-300 dark:border-gray-700">
        <option value="">-- Pilih Jantina --</option>
        @foreach($genders as $code => $descr)
            <option value="{{ $code }}"
                {{ old('gender', $record->gender ?? '') == $code ? 'selected' : '' }}>
                {{ $descr }}
            </option>
        @endforeach
    </select>
    @error('gender')
        <p class="text-theme-xs text-error-500 mt-1.5">{{ $message }}</p>
    @enderror
</div>
```

> **Nota `old('status', $record->status ?? '')`:**
> - Dalam `create` → `$record` takde, jadi `$record->status ?? ''` → kosong
> - Dalam `edit` → akan preselect nilai yang dah ada
> - Kalau ada validation error → `old()` akan restore nilai yang disubmit

---

## Cara 2 — Guna Terus dalam Blade (Tanpa Pass dari Controller)

Sesuai untuk paparan ringkas atau bila terlupa pass dari controller.

```html
<select name="status" class="w-full rounded-lg border bg-transparent px-4 py-2.5 ...">
    <option value="">-- Pilih Status --</option>
    @foreach(\App\Models\Backend\Ref::where('cat', 'STATUS')->orderBy('sort')->get() as $ref)
        <option value="{{ $ref->code }}"
            {{ old('status') == $ref->code ? 'selected' : '' }}>
            {{ $ref->descr }}
        </option>
    @endforeach
</select>
```

> ⚠️ **Kurang digalakkan** jika digunakan berulang kali — akan query DB setiap kali view dirender.

---

## Cara 3 — Papar Nilai (Bukan Dropdown) dalam Table / Show Page

Bila nak papar nilai yang tersimpan (contoh: `ACTIVE`) dalam bentuk label yang cantik:

```html
{{-- Dalam index.blade.php atau show.blade.php --}}

{{-- Cara mudah - terus query --}}
{{ \App\Models\Backend\Ref::where('cat', 'STATUS')
    ->where('code', $record->status)
    ->value('descr') ?? '-' }}

{{-- Atau preload dulu dalam controller untuk performance --}}
{{-- Controller: $statusList = Ref::where('cat','STATUS')->pluck('descr','code'); --}}
{{ $statusList[$record->status] ?? '-' }}
```

---

## Cara 4 — Dropdown Bersarang (Parent-Child)

Contoh: **Daerah** bergantung pada **Negeri** yang dipilih (menggunakan field `parent`).

```html
<!-- Data dalam ref:
     cat=NEGERI, code=SGR, descr=Selangor, parent=null
     cat=DAERAH, code=PJ,  descr=Petaling Jaya, parent=SGR
     cat=DAERAH, code=KL,  descr=Klang, parent=SGR
-->
```

**Controller:**
```php
$negeris  = Ref::where('cat', 'NEGERI')->orderBy('sort')->pluck('descr', 'code');
$daerahs  = Ref::where('cat', 'DAERAH')->orderBy('sort')->get(); // ambil semua dulu

return view('...create', compact('negeris', 'daerahs'));
```

**Blade (dengan Alpine.js untuk filter dinamik):**
```html
<div x-data="{ selectedNegeri: '{{ old('negeri') }}' }">
    <!-- Negeri -->
    <select name="negeri" x-model="selectedNegeri">
        <option value="">-- Pilih Negeri --</option>
        @foreach($negeris as $code => $descr)
            <option value="{{ $code }}">{{ $descr }}</option>
        @endforeach
    </select>

    <!-- Daerah - filter ikut negeri yang dipilih -->
    <select name="daerah">
        <option value="">-- Pilih Daerah --</option>
        @foreach($daerahs as $d)
            <option value="{{ $d->code }}"
                x-show="selectedNegeri === '{{ $d->parent }}'"
                {{ old('daerah') == $d->code ? 'selected' : '' }}>
                {{ $d->descr }}
            </option>
        @endforeach
    </select>
</div>
```

---

## Cara 5 — Dalam FormRequest Validation

Pastikan nilai yang disubmit betul-betul wujud dalam table `ref`:

```php
// Dalam SomeRequest.php
use Illuminate\Validation\Rule;

public function rules(): array
{
    return [
        'status' => [
            'required',
            Rule::in(\App\Models\Backend\Ref::where('cat', 'STATUS')->pluck('code')),
        ],
        'gender' => [
            'nullable',
            Rule::in(\App\Models\Backend\Ref::where('cat', 'GENDER')->pluck('code')),
        ],
    ];
}
```

---

## Ringkasan — Bila Guna Cara Mana?

| Situasi | Cara Yang Sesuai |
|---------|-----------------|
| Form create/edit standard | **Cara 1** — pass dari controller |
| Paparan dalam table/show | **Cara 3** — preload atau query terus |
| Dropdown bergantung satu sama lain | **Cara 4** — parent-child dengan Alpine.js |
| Validate input dari dropdown ref | **Cara 5** — `Rule::in()` dalam FormRequest |
| Prototaip / debug cepat | **Cara 2** — query terus dalam blade |
