Skip to content

Model Provinsi

Model Province merepresentasikan provinsi di Indonesia dan menyediakan akses ke semua 34 wilayah administratif provinsi.

Referensi Kelas

php
namespace Creasi\Nusa\Models;

class Province extends Model
{
    // Implementasi model
}

Atribut

Atribut Utama

AtributTipeDeskripsiContoh
codestringKode provinsi 2 digit (Kunci Utama)"33"
namestringNama provinsi dalam bahasa Indonesia"Jawa Tengah"
latitudefloatLintang pusat geografis-6.9934809206806
longitudefloatBujur pusat geografis110.42024335421
coordinatesarray|nullKoordinat poligon batas[[-6.123, 110.456], ...]

Atribut Terkomputasi

AtributTipeDeskripsi
postal_codesarraySemua kode pos di dalam provinsi

Relasi

Relasi One-to-Many

php
// Dapatkan semua kabupaten/kota di provinsi
$province->regencies; // Collection<Regency>

// Dapatkan semua kecamatan di provinsi  
$province->districts; // Collection<District>

// Dapatkan semua desa/kelurahan di provinsi
$province->villages; // Collection<Village>

Metode Relasi

php
// Relasi Regencies
public function regencies(): HasMany
{
    return $this->hasMany(Regency::class, 'province_code', 'code');
}

// Relasi Districts (melalui kabupaten/kota)
public function districts(): HasMany
{
    return $this->hasMany(District::class, 'province_code', 'code');
}

// Relasi Villages (melalui kecamatan)
public function villages(): HasMany
{
    return $this->hasMany(Village::class, 'province_code', 'code');
}

Scope

Scope Pencarian

php
// Cari berdasarkan nama atau kode (tidak peka huruf besar/kecil)
Province::search('jawa')->get();
Province::search('33')->first();
Province::search('tengah')->get();

Implementasi:

php
public function scopeSearch($query, $term)
{
    return $query->where(function ($q) use ($term) {
        $q->where('name', 'like', "%{$term}%")
          ->orWhere('code', 'like', "%{$term}%");
    });
}

Metode

Metode Statis

php
// Temukan provinsi berdasarkan kode
Province::find('33'); // Mengembalikan Province atau null

// Temukan atau gagal
Province::findOrFail('33'); // Mengembalikan Province atau melempar exception

// Dapatkan semua provinsi
Province::all(); // Collection<Province>

// Dapatkan dengan paginasi
Province::paginate(15); // LengthAwarePaginator

Metode Instans

php
$province = Province::find('33');

// Dapatkan kode pos di provinsi ini
$postalCodes = $province->postal_codes; // array

// Hitung catatan terkait
$regencyCount = $province->regencies()->count();
$districtCount = $province->districts()->count(); 
$villageCount = $province->villages()->count();

Contoh Penggunaan

Kueri Dasar

php
use Creasi\Nusa\Models\Province;

// Dapatkan semua provinsi
$provinces = Province::all();

// Temukan provinsi tertentu
$centralJava = Province::find('33');
$westJava = Province::find('32');

// Cari provinsi
$javaProvinces = Province::search('jawa')->get();
$province33 = Province::search('33')->first();

Dengan Relasi

php
// Eager load relasi
$provinces = Province::with(['regencies'])->get();

// Muat relasi bersarang
$province = Province::with(['regencies.districts.villages'])->find('33');

// Muat kolom tertentu
$provinces = Province::with(['regencies:code,province_code,name'])->get();

Penyaringan dan Pengurutan

php
// Dapatkan provinsi tertentu
$selectedProvinces = Province::whereIn('code', ['33', '34', '35'])->get();

// Urutkan berdasarkan nama
$provinces = Province::orderBy('name')->get();

// Dapatkan provinsi dengan koordinat
$provincesWithCoords = Province::whereNotNull('latitude')
    ->whereNotNull('longitude')
    ->get();

Agregasi

php
// Hitung kabupaten/kota per provinsi
$provincesWithCounts = Province::withCount('regencies')->get();

foreach ($provincesWithCounts as $province) {
    echo "{$province->name}: {$province->regencies_count} kabupaten/kota";
}

// Dapatkan provinsi dengan kabupaten/kota terbanyak
$topProvince = Province::withCount('regencies')
    ->orderBy('regencies_count', 'desc')
    ->first();

Kueri Geografis

php
// Dapatkan provinsi dalam rentang koordinat tertentu
$provinces = Province::whereBetween('latitude', [-8, -5])
    ->whereBetween('longitude', [105, 115])
    ->get();

// Temukan provinsi terdekat dari koordinat
function findNearestProvince($lat, $lon) {
    $provinces = Province::whereNotNull('latitude')
        ->whereNotNull('longitude')
        ->get();
        
    $nearest = null;
    $minDistance = PHP_FLOAT_MAX;
    
    foreach ($provinces as $province) {
        $distance = calculateDistance($lat, $lon, $province->latitude, $province->longitude);
        if ($distance < $minDistance) {
            $minDistance = $distance;
            $nearest = $province;
        }
    }
    
    return $nearest;
}

Bekerja dengan Koordinat

Koordinat Batas

php
$province = Province::find('33');

if ($province->coordinates) {
    // Konversi ke GeoJSON
    $geoJson = [
        'type' => 'Feature',
        'properties' => [
            'name' => $province->name,
            'code' => $province->code
        ],
        'geometry' => [
            'type' => 'Polygon',
            'coordinates' => [$province->coordinates]
        ]
    ];
    
    // Gunakan dengan pustaka pemetaan
    return response()->json($geoJson);
}

Koordinat Pusat

php
$province = Province::find('33');

// Dapatkan titik pusat
$centerLat = $province->latitude;
$centerLon = $province->longitude;

// Gunakan dengan peta
echo "Pusat provinsi: {$centerLat}, {$centerLon}";

Operasi Kode Pos

php
$province = Province::find('33');

// Dapatkan semua kode pos di provinsi
$postalCodes = $province->postal_codes;
echo "Kode pos: " . implode(', ', $postalCodes);

// Temukan provinsi berdasarkan kode pos
$villages = Village::where('postal_code', '51111')->get();
$provinces = $villages->pluck('province_code')->unique();

Tips Kinerja

Kueri yang Efisien

php
// Baik: Pilih kolom tertentu
$provinces = Province::select('code', 'name')->get();

// Baik: Gunakan paginasi untuk dataset besar
$provinces = Province::paginate(15);

// Baik: Gunakan whereIn untuk beberapa kode
$provinces = Province::whereIn('code', ['33', '34', '35'])->get();

// Hindari: Memuat semua data termasuk koordinat besar
$provinces = Province::all(); // Memuat semua koordinat

Caching

php
use Illuminate\Support\Facades\Cache;

// Cache daftar provinsi
$provinces = Cache::remember('provinces', 3600, function () {
    return Province::orderBy('name')->get(['code', 'name']);
});

// Cache provinsi tertentu
$province = Cache::remember("province.{$code}", 3600, function () use ($code) {
    return Province::find($code);
});

Validasi

Validasi Formulir

php
// Validasi kode provinsi ada
'province_code' => 'required|exists:nusa.provinces,code'

// Aturan validasi kustom
use Illuminate\Contracts\Validation\Rule;

class ValidProvinceCode implements Rule
{
    public function passes($attribute, $value)
    {
        return Province::where('code', $value)->exists();
    }
    
    public function message()
    {
        return 'Provinsi yang dipilih tidak valid.';
    }
}

Skema Database

sql
CREATE TABLE provinces (
    code VARCHAR(2) PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    latitude DOUBLE NULL,
    longitude DOUBLE NULL,
    coordinates JSON NULL
);

-- Indeks
CREATE INDEX idx_provinces_name ON provinces(name);
CREATE INDEX idx_provinces_coordinates ON provinces(latitude, longitude);

Konstanta

php
// Jumlah total provinsi di Indonesia
Province::count(); // 34

// Kode provinsi selalu 2 digit
// Contoh: '11', '12', '13', ..., '94', '95', '96'

Model Terkait

Released under the MIT License.