10 Laravel Eloquent Tips dan Trik

Muhammad Rizqy 28 Oktober 2020

10 Laravel Eloquent Tips dan Trik

Hai sobat Coders! Pada artikel ini kita akan membahas seputar tips dan trik Eloquent. Seperti yang kita ketahui Eloquent adalah sebuah fitur yang terdapat pada laravel yang digunakan untuk mengelola database dengan mudah. Eloquent menyediakan berbagai fungsi query SQL, namun mungkin banyak fungsi tersembunyi yang belum sobat Coders ketahui. Jadi, mari langsung kita bahas saja.

1. Increments dan Decrements

Daripada menggunakan ini:

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

Lebih baik gunakan ini:

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

Atau bisa juga seperti ini:

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

2. XorY Methods

Eloquent menyediakan fungsi yang menggabungkan dua methods, seperti XorY (lakukan X, jika tidak lakukan Y)

Contoh 1 - findOrFail()

Daripada seperti ini:

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

Lebih baik lakukan ini:

$user  = User::findOrFail($id);

Contoh 2 - firstOrCreate()

Daripada seperti ini:

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

Lebih singkat seperti ini:

$user = User::firstOrCreate(['email' => $email]);

3. Relasi dengan Kondisi dan Ordering

Berikut cara yang biasa digunakan untuk membuat relasi.

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

Pada code realasi tersebut kita bisa menambahkan method where dan orderBy.

Misalnya jika kita ingin membuat relasi dengan kriteria tertentu untuk beberapa pengguna dan diurutkan oleh email, maka kita bisa melakukan ini.

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

4. Find Multiple Entries

Pasti Coders sudah tahu kan dengan method find

$user  = User::find(1);

Tapi apakah kamu tahun kalau method find dapat menerima banyak ID sebagai Array:

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

5. WhereX

Jika biasanya seperti ini:

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

Kita bisa membuatnya seperti ini:

$users = User::whereApproved(1)->get();

6. Order by relationship

Pernahkan Coders melihat website forum atau portal berita? Nah, biasanya post terakhir berada pada paling atas. Dan berikut contoh trik untuk membuat post terakhir agar posisinya berada paling atas. Pertama, Pada Model buat sebuah method seperti ini

public  function latestPost() { 
    return  $this->hasOne(\App\Post::class)->latest(); 
}

Kemudian pada Controller tinggal menuliskan seperti ini

$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');

7. Eloquent::when()

Mungkin banyak dari kita menuliskan query bersyarat dengan if-else, seperti ini:

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')); 
}

Namun sebenarnya ada cara yang lebih baik, yaitu menggunakan when():

$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')); 
});

Mungkin menggunakan when() lebih panjang codenya, tetapi yang berguna kita bisa melewatkan parameter seperti:

$query = User::query(); 

$query->when(request('role', false), function ($q, $role) { 
return $q->where('role_id', $role); 
});
 
$authors = $query->get();

8. Model boot() method

Method boot() dapat digunakan untuk mengganti default; Misalkan jika kita ingin User::all() selalu diurutkan berdasarkan field name, maka bisa buat seperti ini

protected  static  function boot() {
    parent::boot(); 
    // Order by name ASC
    static::addGlobalScope('order', function (Builder $builder) { 
	    $builder->orderBy('name', 'asc'); 
    }); 
}

9. Ubah Query SQL ke Eloquent

Bagaimana jika kita mempunya query SQL seperti ini:

...  WHERE (gender = 'Male'  and age >= 18) or (gender = 'Female'  and age >= 65)

Dan kita ingin mengubahnya ke Eloquent, jika sobat Coders melakukan cara seperti ini, maka ini adalah cara yang salah.

$q->where('gender', 'Male'); 
$q->orWhere('age', '>=', 18); 
$q->where('gender', 'Female'); 
$q->orWhere('age', '>=', 65);

Cara yang benar adalah menggunakan fungsi closure sebagai sub-kueri:

$q->where(function ($query) { 
    $query->where('gender', 'Male') 
	    ->where('age', '>=', 18); 
})->orWhere(function($query) { 
$query->where('gender', 'Female') 
	->where('age', '>=', 65); 
})

10. orWhere dengan Beberapa Parameter

Terakhir, kita bisa memberikan parameter array ke method orWhere Cara yang biasa:

$q->where('a', 1); 
$q->orWhere('b', 2); 
$q->orWhere('c', 3);

Cara menggunakan parameter array:

$q->where('a', 1); 
$q->orWhere(['b' => 2, 'c' => 3]);

Oke selesai sudah pembahasan tentang tips dan trik Eloquent. Semoga berguna dan bermanfaat untuk Coders.

source: laravel-news