lacodix/laravel-global-or-scope
laravel-global-or-scope
This package allows you to add global scopes to models combined with an or condition. It contains additional functionality to disable some or all or-scopes on the fly.
Documentation
You can find the entire documentation for this package on our documentation site
Installation
composer require lacodix/laravel-global-or-scope
Basic Usage
Just add the trait to your eloquent model and then you can use the addGlobalOrScopes method when booting.
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
use Lacodix\LaravelGlobalOrScope\Traits\GlobalOrScope;
class Post extends Model
{
use GlobalOrScope;
public static function booting(): void
{
static::addGlobalOrScopes([Scope1::class, Scope2::class]);
}
}
class Scope1 implements Scope
{
public function apply(Builder $builder, Model $model)
{
return $builder->whereNull('col1')->where('col2', 1);
}
}
class Scope2 implements Scope
{
public function apply(Builder $builder, Model $model)
{
return $builder->where('col3', 2);
}
}
...
Post::query()->where('user_id', 1000)->get();
This results in running the following SQL Query
select * from "posts" where "user_id" = 1000 and (("col1" is null and "col2" = 1) or ("col3" = 2))
For temporary disabling you can use
Post::query()->withoutGlobalOrScopes()->where('user_id', 1000)->get();
what results in a simple
select * from "posts" where "user_id" = 1000
Testing
composer test
Contributing
Please run the following commands and solve potential problems before committing and think about adding tests for new functionality.
composer rector:test
composer insights
composer csfixer:test
composer phpstan:test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Credits
License
The MIT License (MIT). Please see License File for more information.
Related Packages
A Laravel package to filter, search and sort models with ease while fetching fro...
Adds application level cascading deletes to Eloquent Models.
Fluent Meta Data for Eloquent Models, as if it is a property on your model.