Eloquent ORM di Laravel, Membuat Model Aplikasi

Laravel menyediakan cara mudah dalam mengakses database yaitu Eloquent ORM (Object Relational Model), sebuah implementasi ActiveRecord ketika bekerja dengan database. Setiap tabel database memiliki hubungan dengan model yang digunakan untuk berinteraksi dengan tabel tersebut.

Pada tulisan sebelumnya, kita sudah memiliki tabel dalam database yang dibuat melalui migration bernama cities dan memasukkan data dummy ke dalam tabel tersebut. Tulisan ini akan melanjutkan pemodelan data yang dihubungkan dengan tabel dan data di dalamnya.

Model aplikasi mengijinkan untuk query data di dalam tabel, serta menambahkan, mengubah atau menghapus data tersebut. Tulisan kali ini akan membahas cara membuat model, bagaimana ketentuan dalam model dan mengambil data (query) yang akan ditampilkan ke laman web.

Membuat Model

Membuat model dapat dilakukan dengan menggunakan perintah Artisan make:model. Model yang akan dibuat bernama City dan dihubungkan ke tabel cities yang terdapat di database.

$ php artisan make:model City

Dalam pembuatan model, migration dapat dibuat secara otomatis dibuat dengan menyertakan opsi --migration atau disingkat -m. Berikut perintah pembuatan model beserta migration:

$ php artisan make:model City --migration
$ php artisan make:model City -m
Model created successfully.
Created Migration: 2019_03_17_005308_create_cities_table

Model yang dibuat dengan perintah Artisan di atas akan disimpan di file app/City.php, berikut isi file model City:

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;

class City extends Model
{
    
}

Ketentuan Pemodelan

Eloquent menganggap bahwa kelas model City secara otomatis terhubung dengan tabel cities, bentuk jamak dari nama kelas tersebut. Begitu pula ketika model User dibuat, maka diasumsikan terdapat tabel users di database yang dihubungkan dengan model tersebut. Keterkaitan model dengan tabel database tersebut dapat didefinisikan secara manual dengan melalui properti $table:

class City extends Model
{
    protected $table = 'tbl_city';    
}

Selain nama tabel, Eloquent juga menganggap bahwa setiap tabel memiliki kolom bernama id sebagai primary key. Gunakan properti $primaryKey jika ingin menggunakan nama kolom lain sebagai primary key tabel:

class City extends Model
{
    ...
    protected $primaryKey = 'city_ID';    
}

Elequent juga memiliki 2 kolom timestamp yang selalu ada di model yaitu created_at dan updated_at. Jika tidak menginginkan keberadaan kolom timestamp ini, set properti $timestamps menjadi false.

class City extends Model
{
    ...
    protected $timestamps = false;
}

Sama seperti pada tulisan sebelumnya membuat migration database, struktur tabel cities ketika dibuat menggunakan schema builder adalah sebagai berikut:

Schema::create('cities', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->string('map');
    $table->timestamps();
});

Masukkan data dummy dengan menggunakan seeder database, dan query data tersebut pada model dengan query builder. Sebagai contoh memanggil semua data dengan metode all():

App\City::all();

Untuk memastikan model berjalan dengan baik dengan memanggil metode di atas untuk ditampilkan ke dalam view seperti di bawah ini:

...
<h1>Daftar Kota Jabodetabek</h1>
@php $cities = App\City::all(); @endphp
<ul class="list-group">
    @foreach ($cities as $city)
    <li class="list-group-item">
        <a href="{{ $city->map }}" target="_blank">
            {{ $city->name }}
        </a>
    </li>
    @endforeach
</ul>
...

Hubungan antar Tabel

Tabel-tabel di database sering kali berhubungan satu sama lain. Sebagai contoh tabel People yang berisikan data penduduk berhubungan dengan tabel Cities.

Eloquent memudahkan mengelola hubungan antar tabel tersebut dan mendukung berbagai jenis hubungan. Untuk mempermudah pemahaman tentang relasi, sekarang kita buat model seorang penduduk yaitu model Person (bentuk tunggal dari People) yang berelasi dengan model City.

$ php artisan make:model Person -m
Model created successfully.
Created Migration: 2019_03_17_072450_create_people_table

Dari perintah di atas, dibuat secara otomatis migration tabel people, buat struktur tabel sebagai berikut:

Schema::create('people', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('city_id');
    $table->string('name');
    $table->string('age');
    $table->timestamps();
    $table->foreign('city_id')->references('id')->on('cities');
});

Dari struktur di atas dapat kita lihat bahwa terdapat field city_id sebagai foreign key yang berelasi dengan tabel cities. Jika dimodelkan, hubungan ini termasuk ke dalam tipe one-to-many, di mana City dapat mempunyai banyak data Person. Berikut kode pemodelan yang dilakukan di model City:

class City extends Model
{
    public function people()
    {
        return $this->hasMany('App\Person');
    }
}

Begitu pula di model Person yang mempunyai hubungan terbalik dengan model City di definisikan sebagai berikut:

class Person extends Model
{
    public function city()
    {
        return $this->belongsTo('App\City');
    }
}

Setelah hubungan dipetakan, kita dapat mengakses koleksi data Person dengan mengakses properti people

$people = App\City::find(1)->people;

foreach ($people as $person) {
    //
}

Kode Github