Press "Enter" to skip to content

Membuat Global Where pada Eloquent Laravel

fadli 2

Membuat Global Where pada Eloquent Laravel – Haloo semuanya, Assalaamualaikum wr wb, apa kabar nya? Semoga sehat selalu yaa..

Setelah sebelumnya kita sudah membahas tentang 27 trik belajar eloquent pada laravel, kemudian kita juga sudah mempelajari 5 cara filter Tanggal pada Laravel..

Nah sekarang selanjutnya kita akan mempelajari salah satu trick magic dari eloquent laravel, yaitu membuat Global Where atau yang biasa disebut dengan Global Scope..

Membuat Global Where pada Eloquent Laravel

Ketika sudah membuat query where pada global scope, maka setiap kali kita mengakses model tersebut, apapun jenis perintah query nya, maka secara otomatis query global scope nya juga akan di eksekusi..

Misalkan sebagai contoh, kita memiliki data penjualan yang terpecah menjadi beberapa jenis cabang.. Data penjualan cabang A, data penjualan cabang B, dan seterusnya..

Biasanya, ketika kita ingin menarik data penjualan dari cabang A, maka akan menjalankan query seperti berikut:

....
Sale::where('cabang_id','cabang_A')->get();
....

Kita perlu mendefine jenis cabang nya pada kondisi where nya, nah terkadang hal ini cukup merepotkan jika kita terus menerus membuat kondisi where seperti tsb, bahkan terkadang ada beberapa programmer yang lupa memfilter cabang nya, yang akhirnya data report nya pun jadi tercampur dengan cabang yang lainnya..

Solusinya yaitu dengan global scope..

Ketika kita sudah menerapkan global scope / global where pada model Sale nya, anggap saja query where cabang nya sudah kita taruh pada mode global scope..

kita tidak perlu lagi membuat query where cabang seperti diatas, cukup dengan query get saja seperti berikut:

....
Sale::get();
....

Maka nanti otomatis query where cabang yg ada pada mode global scope nya juga akan ikut ter-eksekusi..

Cara membuat global scopes

Sebetulnya cara kerja dari global scopes mirip seperti soft deletes pada laravel yang sebelumnya sudah pernah kita bahas..

Yang mana jika kita perhatikan, soft delete sebetulnya juga membuat sebuah global scope dengan query whereNull(‘deleted_at’);.. Dan setiap kali kita mengeksekusi model tersebut, maka query tersebut juga otomatis akan tereksekusi..

Untuk cara pembuatan global scopes terbagi menjadi 2 jenis, tapi cara yang paling mudah dan simple yaitu dengan tekhnik Anonymous global scopes.. Untuk perbedaan nya bisa kalian baca sendiri dihalaman resmi nya disini..

Pada setiap versi laravel, sebetulnya memiliki perbedaan dalam penulisan global scopes nya, akan kita bahas semua nya mulai dari laravel versi 8 sampai kebawah nya..

Laravel 8

Berikut adalah contoh global scopes pada laravel 8:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::addGlobalScope('ancient', function (Builder $builder) {
            $builder->where('cabang_id', 1);
        });
    }
}

Laravel 7

<?php

namespace App;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('cabang_id', 1);
        });
    }
}

Laravel 6

<?php

namespace App;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('cabang_id', 1);
        });
    }
}

Laravel 5.8

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.7

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.6

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.5

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.4

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.3

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function (Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Laravel 5.2

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('age', function(Builder $builder) {
            $builder->where('age', '>', 200);
        });
    }
}

Cara Menghapus Global Scopes

Terkadang dalam kondisi tertentu, kita tidak ingin menjalankan query global scopes yang sudah pernah kita buat.. Hanya dalam beberapa kondisi tertentu saja..

Nah kita bisa mengabaikan nya dengan menggunakan perintah seperti berikut:

User::withoutGlobalScope('ancient')->get();

Kita memanggil sebuah function withoutGlobalScope(‘ancient’).. yang mana pada function tersebut kita memasukkan nama scope nya sebagai parameter yang ingin di abaikan.. Pada contoh diatas kita mengabaikan global scope ancient..

Kalo pada model kalian terdapat beberapa global scope, dan kalian ingin menonaktifkan semua nya, cukup jalankan perintah seperti berikut:

User::withoutGlobalScopes()->get();

Dengan perintah diatas, maka semua global scopes yang ada pada model User akan diabaikan alias tidak akan di eksekusi..

Semoga bermanfaat.. Sekian dan Terima Kasih..

Support Us

Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid

Terima kasih..

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: