Laravel Scopes


Rafi Taufiqurrahman
A Backend Developer specialized in Laravel
Laravel Scopes

Pada artikel ini kita akan mencoba untuk mempelajari salah satu magic dari eloquent laravel yaitu Scopes. Kita akan mencoba memasukan Scopes yang kita buat kedalam code yang kita tulis, agar controller kita terlihat lebih clean, disini kita hanya akan menggunakan Local Scopes karena untuk Global Scopes saya sendiri jarang menggunakannya, eitss tapi bagi kalian yang ingin mencoba Global Scopes kalian bisa membaca dokumentasinya secara langsung di sini Laravel Global Scopes.

Oke langsung aja kita kenalan dulu ya sama si magic eloquent yang satu ini, Scopes lebih spesifiknya Local Scopes digunakan untuk mempersingkat query yang sering kita gunakan agar query tersebut dapat kita gunakan secara terus menerus (Reusable).

Gimana udah paham maksudnya belum ? kalo belum yudh kita cobain sama - sama ya.

Oke langkah awal kita memiliki tabel users yang dimana strukturnya kurang lebih seperti ini :

id name email password status
1 Rafi raf@mail.com ######### 1
2 Rsai rsaf@mail.com ######### 0
3 Resa res@mail.com ######### 0

Dari tabel di atas kita akan coba mendapatkan data user dengan kondisi dimana user tersebut memiliki status sama dengan 1.

Oke langkah berikutnya kita akan buat query tersebut didalam controller kita, kurang lebih seperti ini :

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $users = User::where('status', 1)->get();

        return view('user.index', compact('users'));
    }
}

Pada query di atas dipastikan kita akan mendapatkan data user dengan kondisi dimana user tersebut memiliki status sama dengan 1, oke kode diatas berhasil dijalankan tanpa ada masalah, eitts tapi coba kita bayangkan sebentar, kita melakukan query tersebut secara berulang - ulang pada setiap method yang kita miliki dan juga pada tiap controller yang kita miliki. pasti akan sangat banyak perulangan query yang kita lakukan kemudian coba kita bayangkan kita ubah sedikit saja kondisi user yang tadinya statusnya sama dengan 1 kita ubah menjadi active pasti kita akan melakukan perubahan pada tiap method dan controller yang kita miliki.

Oleh karena itu Laravel menyediakan si magic ini, iya bener tebakan kalian bener Local Scopes :D, oke langsung aja kita cobain buat Local Scopenya, codenya seperti ini :

public function scopeActive(){
    // didalam sini kita akan memasukan query yang kita buat sebelumnya
}

pada penamaanya sendiri wajib diawali dengan kata scope setelahnya kalian bebas memberikan nama apapun tapi Camel Case ya, dikarenakan kita ingin mendapatkan data user dengan status 1 dimana artinya status user tersebut bernilai true sehingga kita berinama scopenya scopeActive.

Oke sekarnang kita sudah tau cara membuat scopenya, kita coba implementasikan pada query yang sebelumnya kita buat.

ikuti langkah - langkah dibawah ya :

  1. Pertama buka model user kalian App\Http\Models\User.php
  2. Kemudian pada model tersebut kita masukan sebuah method scope yang kita beri nama scopeActive seperti code dibawah
<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    public function scopeActive($query)
    {
        return $query->where('status', 1);
    }
}
  1. Setelah berhasil mendefinisikan sebuah scope pada model kemudian kita panggil scope tersebut di dalam controller yg kita miliki sebelumnya, cara pemanggilannya juga sangat mudah seperti code dibawah :
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        // pemanggilan scopeActive
        $users = User::active()->get();

        return view('user.index', compact('users'));
    }
}

Terlihat lebih simpel dan readable, yang sebelumnya kita menulisakan query seperti ini User::where('status', 1)->get() sekarang menjadi hanya menjadi seperti ini User::active()->get(), dan juga jika kita ingin melakukan perubahan pada query kita, kita hanya perlu melakukan perubahan pada code scopeActive yang kita buat di dalam model tersebut, sehingga kita tidak perlu menggati semua query yang kita tuliskan di controller kita.

Oke sampai sini, sudah terasa belum magicnya ? oiya bang, misal aku mau query scopenya bersifat dinamis gimana bang? ohh untuk itu tenang aja scope yang kita buat sebelumnya bisa kita tambahkan paramater agar dia bersifat dinamis, contohnya seperti ini :

    public function scopeActive($query, $type)
    {
        return $query->where('status', $type);
    }

terlihat kita menambahkan sebuah paramater $type didalam method kita sehingga scope yang kita miliki menjadi bersifat dinamis, untuk pemanggilannya sendiri di controller sangat mudah yang sebelumnya kita buat static seperti ini User::active()->get() kita ubah menjadi dinamis seperti ini users = User::active(0)->get(); yg dimana isi dari active dapat kita ubah sesuai kebutuhan kita.

Sampai disini dulu ya artikel kali ini, kita ketemu lagi di next artikel ya, kalo ada pertanyaan silahkan cantumkan di kolom komentar :D

Terima kasih.


Rafi Taufiqurrahman
A Backend Developer specialized in Laravel

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami