
Pendahuluan
Bayangin lagi ngerjain fitur sederhana, tapi kamu harus nambahin where('active', 1) di setiap query yang manggil model user. Awalnya kelihatan enteng, tapi pas query-nya nambah jadi puluhan file, risiko lupa nambahin filter itu jadi ancaman nyata. Di sinilah Global Scope di Laravel jadi penyelamat hidup saya biar nggak terus-terusan kena bug data yang seharusnya 'tersembunyi'.
Tips & Best Practices
- Di banyak project, biasanya saya mulai dari bikin class scope terpisah agar logika filter tidak menumpuk di file model yang sudah panjang.
- Saat nentuin nama scope, pastikan namanya deskriptif seperti
ActiveScopeatauPublishedScopeagar rekan tim lain paham tanpa harus baca isi logic-nya. - Selalu cek apakah logic yang kamu buat perlu di-bypass atau nggak, karena terkadang kita butuh ngambil data yang 'dihapus' atau 'non-aktif' untuk keperluan admin dashboard.
Contoh Kode
Kalau mau bikin scope otomatis, buat class yang implement interface Scope. Ini contoh pas mau filter data yang cuma statusnya 'published':
// App/Scopes/PublishedScope.php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class PublishedScope implements Scope {
public function apply(Builder $builder, Model $model) {
$builder->where('status', 'published');
}
}Lalu di model kamu, tinggal panggil di method booted:
protected static function booted() {
static::addGlobalScope(new PublishedScope);
}Variasi Implementasi
Kadang kita nggak mau ribet bikin class baru. Kamu bisa pakai addGlobalScope dengan Closure kalau filternya cuma satu baris, jauh lebih ringkas. Tapi, kalau filternya kompleks atau bakal dipakai di banyak model, mending dipisah jadi class supaya nggak bikin file model kamu jadi 'god object' yang sulit dirawat.
Kesalahan Umum
- Lupa kalau Global Scope bakal kena ke semua query, termasuk pas kamu mau update atau delete data secara massal.
- Sering terjebak saat harus akses data yang di-filter, padahal tinggal pakai
Model::withoutGlobalScope(ScopeName::class)->get(). - Memasukkan logic yang berat atau akses DB lain di dalam scope yang bikin aplikasi jadi lambat banget karena dijalankan tiap kali model di-query.
- Bingung sendiri pas scope yang dibuat malah konflik dengan query manual yang kamu tulis di Controller.
- Tidak mengetes scope saat melakukan
eager loading, yang kadang bikin relasi jadi nggak muncul karena filter yang terlalu ketat.
Ringkasan
Jujur, Global Scope itu ibarat 'asisten otomatis' yang bikin kode lebih bersih dan minim duplikasi. Tapi ingat, jangan pakai berlebihan untuk logika yang terlalu spesifik. Pakai sewajarnya, dokumentasikan dengan baik, dan aplikasi Laravel kamu bakal jauh lebih rapi dibanding pas pertama kali nulis manual satu-satu.
Komentar
Posting Komentar