Tips dan Trik Menggunakan Eloquent Laravel

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Nov 08, 2019 — 5 mins read

Eloquent ORM merupakan satu dari banyak hal dalam laravel yang bisa membuat pekerjaan yang berhubungan dengan database menjadi lebih sederhana, banyak fungsi-fungsi yang terkadang tidak terdapat dalam dokumentasi resmi laravel, kali ini saya akan berbagi dengan teman-teman fungsi-fungsi yang sering saya gunakan.

Increaments dan Decrements

daripada menggunakan ini

$article = Article::find($article_id);
$article->dibaca++;
$article->save();

sebaiknya menggunakan ini

$article = Article::find($article_id);
$article->increment('dibaca');

atau seperti ini juga bisa digunakan

Article::find($article_id)->increment('dibaca');
Article::find($article_id)->increment('dilihat', 10); // +10
Product::find($produce_id)->decrement('stock'); // -1

A atau Z

Elequent memiliki beberapa fungsi yang merupakan gabungan dari 2 fungsi misalnya seperti fungsi findOrFail() dan firstOrCreate()

$user = User::find($id);
if (!$user) { abort (404); }

// Atau
$user = User::where('email', $email)->first();
if (!$user) {
  User::create([
    'email' => $email
  ]);
}

sebaiknya menggunakan

$user = User::findOrFail($id);
// Atau
$user = User::firstOrCreate(['email' => $email]);

Boot

Ada sebuah fungsi pada Elequent Model yang sangat jarang digunakan, padahal sangat bisa membantu, dengan bantuan fungsi ini kita bisa melakukan override fungsi default bawaan Elequent

class User extends Model
{
    public static function boot()
    {
        parent::boot();
        static::updating(function($model)
        {
            // fungsi yang dijalankan 
            // setiap    kali elequent
            //mendapatkan event update 
       });
     }
} 

atau biasanya untuk menggenerate value dalam bentuk uuid random pada saat pembuatan record baru

public static function boot()
{
  parent::boot();
  self::creating(function ($model) {
    $model->uuid = (string)Uuid::generate();
  });
}

Relasi dengan Kondisi dan Order

bentuk pendifinisian relasi pada laravel biasanya seperti berikut

public function users() {
    return $this->hasMany('App\User');    
}

Tapi teman-teman tau tidak, jika bentuk tersebut tidak mutlak, artinya kita masih bisa menambahkan chain method untuk kondisi dan order by pada sebuah relasi, misalnya

public function approvedUsers() {
    return $this->hasMany('App\User')
         ->where('approved', 1)
         ->orderBy('email');
}

Model Properties

Ada beberapa parameter pada Eloquent Model yang jarang digunakan pada saat kita membuat sebuah model, bentuk yang paling umumnya seperti berikut

class User extends Model {
    protected $table = 'users';
    protected $fillable = ['email', 'password']; 
    protected $dates = ['tgl_lahir', 'tgl_jadian']; 
    protected $appends = ['field1', 'field2']; 
}

tapi ada beberapa parameter lagi yang bisa kita gunakan misalnya seperti

protected $primaryKey = 'uuid'; // primary key tidak selalu id
public $incrementing = false; // disable auto increament
protected $perPage = 25; // default pagging per page
const CREATED_AT = 'tgl_dibuat'; // ganti field created_at 
const UPDATED_AT = 'tgl_diupdate';  // ganti field updated_at
public $timestamps = false; // disable timestamp

masih banyak lagi sebenarnya, jika teman-teman melihat abstract Model Class pada laravel.

Cari Berdasarkan ID

Biasanya jika ingin mencari data berdasarkan id kita selalu menggunakan find() method atau menggunakan whereIn() method jika yang dicari lebih dari satu, misalnya

$user = User::find(1);
$user = User::whereIn('id',[1,2,3]);

tetapi sebenarnya kita bisa menggunakan cara yang lebih simple lagi, misalnya

$user = User::find([1,2,3]);

Where

biasanya banyak yang menggunakan bentuk

$users = User::where('approved', 1)->get();

tetapi sebenarnya laravel menyediakan method yang bisa lebih mudah untuk dimengerti ketika kita menggunakan where(), yaitu dengan mendifinisikan nama field langsung sebagai method, misalnya

$users = User::whereApproved(1)->get(); 
$user  = User::WhereNamaBelakang('Ichigo')->get()
$user  = User::WhereEmail('i@me.com')->get()

When

Biasanya kita menggunakan if else untuk menentukan kondisi tertentu dalam memanggil model, misalnya

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

tetapi sebenarnya ada cara yang lebih cantik untuk hal itu, kita bisa menggunakan method when(), misalnya

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

BelongsTo

Misalnya kita punya data berita yang memiliki penulis, biasanya kita akan menggunakan

{{ $post->penulis->nama }}

tetapi bagaiaman jika penulisnya dihapus ? atau belum di set dengan alasan tertentu, tentu saja fungsi diataas akan error, property of non object, untuk itu kisa bisa mengatasinya dengan cara

{{ $post->penulis->nama ?? '' }}

tetapi teman-teman tau ga, jika sebenarnya kita bisa mengatasi hal tersebut melalui Eloquent Model

public function penulis()
{
    return $this->belongsTo('App\Penulis')->withDefault();
}

dengan begitu, fungsi penulis() akan memiliki nilai kosong jika relasi model App\Penulis tidak ada, atau bahkan jika kita tidak ingin bentuk returnya kosong, kita bisa menentukan nilai default

public function penulis()
{
    return $this->belongsTo('App\Penulis')->withDefault([
        'name' => 'Kurosaki Ichigo'
    ]);
}

Order By Mutator

Misalnya kita punya data seperti berikut

function getNamaLengkapAttribute()
{
  return $this->attributes['nama_depan'] . ' ' . $this->attributes['nama_belakang'];
}

kemudian kita ingin data tersebut di order berdasarkan nama lengkap yang fieldnya tidak tersedia dalam tabel, jika kita menggunakan code dibawah ini tentu saja tidak akan berhasil

$pegawai = Pegawai::orderBy('nama_lengkap')->get();

solusinya kita hanya perlu menggunakan method sortBy()

$pegawai = Pegawai::get()->sortBy('nama_lengkap');

Ordering dengan Global Scoope

pada laravel kita bisa menentukan Global Scoope, dimana Global Scoope ini akan default dipanggil ketika model tersebut dipanggil, misalnya secara default kita ingin data user di order bedasarkan tgl_lahir, kita bisa menggunakan method boot() , misalnya

protected static function boot()
{
    parent::boot();
    static::addGlobalScope('order', function (Builder $builder) {
        $builder->orderBy('tgl_lahir', 'asc');
    });
}

Raw Query

Sudah pasti terkadang kita harus menggunakan Raw Query untuk beberapa kebutuhan, sebenarnya Laravel menyediakan fungsi DB::raw untuk itu, tetapi kita juga bisa menggunakan raw query di Eloquent.

// whereRaw
$orders = DB::table('orders')
    ->whereRaw('price > IF(state = "ID", ?, 1000)', [2000])
    ->get();

// havingRaw
Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

// orderByRaw
User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();

Copy Data

Ada pada beberapa kasus ketika client meminta fungsi untuk menduplikasi data, pastinya caranya berbeda-beda setiap orang, tetapi Eloquent menyediakan method untuk itu, misalnya

$tugas = Tugas::find(1);
$tugas_baru = $tugas->replicate();
$tugas_baru->save();

Kesimpulan

Masih banyak cara-cara simple dan indah yang bisa kita gunakan tetapi tidak terdokumentasi dilaravel, mudah-mudahan sedikit tips dan trik ini bisa membuat teman-teman terbantu dalam bekerja dengan database kedepanya.

laravel php
Read this next

Pemrograman Object Oriented PHP Bagian I

Tulisan kali ini mungkin akan sedikit lebih panjang dan membingungkan, tulisan ini merupakan keresahan saya pribadi dan berdasarkan pengalam...

You might enjoy

PHP Fungsi Terbilang

Package sederhana untuk merubah angka menjadi bentuk terbilang dalam bahasa indonsia dengan phpcomposer require ezadev/terbilang penggunaa...