Eloquent ORM (Object Relation Maping) adalah sebuah fitur dari Lumen / Laravel yang di dalamnya terdapat fungsi-fungsi active record (query SQL) untuk mengelola data di database. Dengan menggunakan Eloquent ORM, database bisa kita bungkus ke dalam objek, sehingga operasi CRUD (Create, Read, Update, Delete) pada tabel database dapat dilakukan tanpa melibatkan perintah / query SQL sama sekali, bahkan sampai relasi antar tabelnya juga.

Agar Eloquent ORM dapat bekerja, kita harus terlebih dahulu membuat Model yang mewakili tabel database terkait. Sebagai contoh, tabel sepak_bola diwakili oleh Model SepakBola (penamaan tabel dan Model disarankan sama). Pada sistem MVC (Model View Controller), Model ditandai sebagai M, merupakan sebuah class yang terdiri dari beberapa variabel dan method. Melalui class ini lah jalan pintas ke query SQL nantinya dilakukan.

Membuat Eloquent Model

Di materi sebelumnya Membuat Database Schema dengan Migrations Lumen Laravel, kita telah memiliki sebuah tabel database dengan nama sepak_bola. Sebelum membuat eloquent model, tambahkan beberapa row ke tabel dengan query SQL :

INSERT INTO sepak_bola (klub, pemain) VALUES ('AC Milan', 'Alessandro Costacurta');
INSERT INTO sepak_bola (klub, pemain) VALUES ('AC Milan', 'Alessandro Nesta');
INSERT INTO sepak_bola (klub, pemain) VALUES ('Juventus', 'Alessandro Del Piero');
INSERT INTO sepak_bola (klub, pemain) VALUES ('Juventus', 'Gianluca Zambrotta');
INSERT INTO sepak_bola (klub, pemain) VALUES ('Inter Milan', 'Gianluca Pagliuca');
INSERT INTO sepak_bola (klub, pemain) VALUES ('Inter Milan', 'Francesco Toldo');

Query SQL saya lakukan di terminal via MySQL-CLI setelah login dengan username variancode.

menggunakan eloquent orm lumen laravel

Kemudian hasil penambahan data nama-nama pemain bola beserta klub-nya di atas saya cek melalui aplikasi MySQLWorkbench (sekedar untuk variasi). Anda bisa memakai GUI DBMS lain yang disukai, tidak harus sama dengan saya.

menggunakan eloquent orm lumen laravel

Langkah selanjutnya adalah membuat Model SepakBola untuk tabel database sepak_bola di folder app/Models/ (folder Models/ harus dibuat sendiri), beri nama file SepakBola.php :

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class SepakBola extends Model {
    
    protected $table = 'sepak_bola';

    // protected $fillable = ['klub', 'pemain'];

    protected $guarded = ['id'];
    
}

Jika dalam kondisi tertentu Anda “terpaksa” menggunakan nama Model yang berbeda dengan tabel Database, nama tabel dapat didefinisikan di property $table agar dapat dikenali oleh Eloquent. Sedangkan property $fillable digunakan untuk menentukan kolom mana saja dari tabel yang boleh di-insert data secara mass assignable (menggunakan Eloquent), selain itu tidak diizinkan.

Sebagai alternatif $fillable, bisa menggunakan $guarded yang artinya semua kolom dapat di-insert data menggunakan Eloquent kecuali kolom id (pada contoh di atas). Oya, Anda hanya dapat memilih salah satu, $fillable atau $guarded dalam satu class.

menggunakan eloquent orm lumen laravel

Catatan : perintah php artisan make:model hanya tersedia untuk Laravel, oleh karena itu class Model harus dibuat secara manual pada framework Lumen.

Menggunakan Eloquent ORM di Controller

Setelah instalasi, fitur Eloquent pada Lumen masih belum aktif. Agar dapat digunakan, singkirkan komentar di baris 22 berikut pada file bootstrap/app.php.

menggunakan eloquent orm lumen laravel

Lanjutkan dengan membuat file SepakBolaController.php di dalam folder app/Http/Controllers, copy paste kode di bawah :

<?php

namespace App\Http\Controllers;

use App\Models\SepakBola;

class SepakBolaController extends Controller {

    private function cetakArray($results) {

        foreach ($results as $result) {

            $id = $result->id;
            $klub = $result->klub;
            $pemain = $result->pemain;

            echo "[" . $id . "]" . " " . $klub . " - " . $pemain . "</br>";

        }

    }

    public function index() {

        $results = SepakBola::get();

        $this->cetakArray($results);

    }

    public function filterId($id) {

        $result = SepakBola::where('id', '=', $id)->first();

        $id = $result->id;
        $klub = $result->klub;
        $pemain = $result->pemain;

        echo "[" . $id . "]" . " " . $klub . " - " . $pemain;

    }

    public function filterKlub($namaKlub) {

        $results = SepakBola::where('klub', 'LIKE', '%' . $namaKlub . '%')->get();

        $this->cetakArray($results);

    }

    public function filterPemain($namaPemain) {

        $results = SepakBola::where('pemain', 'LIKE', '%' . $namaPemain . '%')->get();

        $this->cetakArray($results);

    }

}

Diakhiri dengan menambahkan router SepakBola ke dalam file routes/web.php.

// Router SepakBola

$router->group(['prefix' => 'sepakbola'], function() use ($router) {
	
	$router->get('/', 'SepakBolaController@index');

	$router->get('/id/{id}', 'SepakBolaController@filterId');

	$router->get('/klub/{namaKlub}', 'SepakBolaController@filterKlub');

	$router->get('/pemain/{namaPemain}', 'SepakBolaController@filterPemain');

});

Padanan Query SQL untuk Eloquent ORM di file SepakBolaController.php :

  1. Eksekusi Eloquent SepakBola::get() pada method index akan sama hasilnya jika menggunakan query SQL SELECT * FROM sepak_bola;.
  2. Eksekusi Eloquent SepakBola::where('id', '=', $id)->first() pada method filterId akan sama hasilnya jika menggunakan query SQL SELECT * FROM sepak_bola WHERE `id` = $id;.
  3. Eksekusi Eloquent SepakBola::where('klub', 'LIKE', '%' . $namaKlub . '%')->get() pada method filterKlub akan sama hasilnya jika menggunakan query SQL SELECT * FROM sepak_bola WHERE `klub` LIKE '%$namaKlub%';.
  4. Eksekusi Eloquent SepakBola::where('pemain', 'LIKE', '%' . $namaPemain . '%')->get() pada method filterPemain akan sama hasilnya jika menggunakan query SQL SELECT * FROM sepak_bola WHERE `pemain` LIKE '%$namaPemain%';.

Alur routing di file web.php :

  1. Request ke URL http://localhost/sepakbola
    Akan ditangkap oleh router $router->get('/') dan diteruskan ke method index.
  2. Request ke URL http://localhost/sepakbola/id/{argumen}
    Akan ditangkap oleh router $router->get('/id/{id}') dan diteruskan ke method filterId.
  3. Request ke URL http://localhost/sepakbola/klub/{argumen}
    Akan ditangkap oleh router $router->get('/klub/{namaKlub}') dan diteruskan ke method filterKlub.
  4. Request ke URL http://localhost/sepakbola/pemain/{argumen}
    Akan ditangkap oleh router $router->get('/pemain/{namaPemain}') dan diteruskan ke method filterPemain.
  5. Method index, filterId, filterKlub dan filterPemain berada di Controller yang sama SepakBolaController.php

Eksekusi dari setiap request URL diperoleh hasil seperti gambar di bawah :

menggunakan eloquent orm lumen laravel