This post is also available in:
English
Hallo apa kabar teman semua, semoga sehat dan sukses selalu. Kali ini kita akan membahas Scope di Laravel, ini sangat bermanfaat untuk teman teman ketika membuat projek yang mempunyai banyak filter.
Sederhananya scope itu adalah query yang sudah kita buat dan digunakan kembali di modul lain, jadi dengan menggunakan scope kita tidak perlu lagi menulis query yang sama.
intinya laravel scope itu untuk mempermudah kita agar tidak menulis query yang sama berulang-ulang..
Laravel scope sendiri sebetulnya terdapat 2 jenis, yaitu Global Scope dan Local Scope..
Global Scope
Untuk global scope / Global Where sebelumnya kita sudah pernah membahas nya, silahkan kalian kunjungin artikel nya disini: Membuat Global Where Pada Eloquent Laravel..
Jadi dengan global scope, kita hanya perlu menulis query nya 1 kali saja didalam model nya, maka nanti secara otomatis query tersebut akan selalu terpanggil ketika kita menggunakan model tersebut, tanpa harus menulis lagi query nya..
Local Scope
Local Scope sebetulnya sama seperti global scope, hanya saja kita perlu memanggil initial scope nya kembali didalam query nya..
Misalkan sebagai contoh kita memiliki beberapa method yang menarik data Customer dengan ketentuan yang status nya aktif saja..
// method index
public function index()
{
$data = M_customer::where('is_active', 1)->get(); // menarik data customer yg status nya aktif
}
// method show
public function show()
{
$data = M_customer::where('is_active', 1)->get(); // menarik data customer yg status nya aktif
}
Pada 2 method diatas, didalam query nya kita sama-sama menarik data customer yang status nya aktif saja..
Itu baru 2 method, bagaimana kalo ternyata di controller lain kita juga akan menarik data customer yang aktif saja?? Maka kita akan menulis query where is_active=1 secara terus menerus dan berulang-ulang..
Tentu saja hal ini sangat tidak efisien, kenapa? karena kita menulis query yang sama secara berulang-ulang..
Coba bayangkan gimana kalau suatu saat ternyata kondisi nya berubah, yang awal nya is_active=1 kemudian berubah menjadi is_active=’active’.. Maka kita perlu merubah semua query nya pada setiap method dan pada setiap controller..
Solusi nya yaitu dengan menggunakan local scope..
Cara menulis Local Scope
kalian cukup menambahkan local scope pada model M_customer seperti berikut:
....
public function scopeActive($e)
{
return $e->where('is_active', 1);
}
....
Kemudian di query nya kalian hanya perlu memanggil nya seperti berikut:
....
// method index
public function index()
{
$data = M_customer::active()->get(); // menarik data customer yg status nya aktif
}
// method show
public function show()
{
$data = M_customer::active()->get(); // menarik data customer yg status nya aktif
}
....
Terlihat lebih simple dan ringkas, yang awal nya selalu menulis ->where(‘is_active’,1).. sekarang hanya perlu menulis ->active() saja..
Dan jikapun nanti ada perubahan query nya, kita hanya perlu merubah di function scope nya saja..
Syarat penulisan Local Scope
Syarat penulisan Local Scope yaitu:
1. Diawali dengan kata scope pada nama function nya..
....
public function scopeActive($e){
....
2. nama function nya ditulis dengan gaya Camel Case
3. Pada saat pemanggilan scope nya didalam query, kita tidak perlu lagi menulis kata “scope”..
Cara membawa Parameter kedalam Scope
Misalkan kita ingin membuat nilai pada scope nya menjadi dinamis, kita bisa memberikan nya satu atau lebih parameter kedalam nya..
Misalkan sebagai contoh:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Scope a query to only include users of a given type.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $type
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeOfType($query, $type)
{
return $query->where('type', $type);
}
}
....
$users = User::ofType('admin')->get();
....
Demikian tutorial yang bisa saya sampaikan, semoga bermanfaat
Terimakasih…
Sumber : Menggunakan Scope di Laravel