Hi, my name is David Carr and I'm a PHP Developer.


Blog Archives Categories Authors About Me Open Source Books Contact Me

Sponsor Me

Help support the blog so that I can continue creating new content!

My Latest Book

Laravel: The Modular way

Learn how to build modular applications with Laravel Find out more

Laravel apply a query constraint with global scopes

Laravel Framework | PHP & MySQL | Tutorials

David Carr

Laravel apply a query constraint with global scopes

Imagine your building a multi-tenancy application, in your controller your using a Contacts model every single time you pull a query out it needs constraining to the current tenant like this:

$contacts = Contact::where('tenant_id', session('tenant_id')->paginate();

Using a global scope would mean the constraint could be applied to all your queries automatically.

In your model using the static boot method. Add a static addGlobalScope the first param is the name of the scope and the second is a closure which is type hinted to use $builder. 

Inside the closure add the where constraint. In this case I'm saying where the tenant_id matches a tenant_id stored in a session.

protected static function boot()
{
    parent::boot();

    //apply condition to all queries
    static::addGlobalScope('tenent', function (Builder $builder) {
        $builder->where('tenant_id', session('tenant_id'));
    });
}

Import the builder

//import Builder
use Illuminate\Database\Eloquent\Builder;

Now this will be applied automatically to your queries so pull all contacts is now simplified to this:

$contacts = Contact::paginate();

 

Copyright © 2009 - 2022 David Carr. All code MIT license. All rights reserved.