Метод addGlobalScope
Метод addGlobalScope добавляет глобальную область видимости к модели Eloquent. Глобальные области видимости автоматически применяются ко всем запросам, выполняемым через модель, и позволяют задать общие условия фильтрации, которые будут действовать всегда. Первым параметром передаётся имя области видимости или объект класса, реализующего интерфейс GlobalScope, вторым - замыкание, определяющее условия фильтрации.
Синтаксис
<?php
Model::addGlobalScope($name, $callback);
?>
Пример
Давайте добавим глобальную область видимости, которая будет фильтровать только опубликованные статьи:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
class Article extends Model
{
protected static function booted()
{
static::addGlobalScope('published', function ($query) {
$query->where('status', 'published');
});
}
}
?>
Теперь при любом запросе к модели Article будут автоматически выбираться только опубликованные статьи:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::all();
foreach ($articles as $article) {
echo $article->title;
}
}
}
?>
Результат выполнения кода:
["article 1", "article 3", "article 5"]
Пример
Добавим глобальную область видимости через отдельный класс. Создадим класс области видимости, который будет фильтровать активных пользователей:
<?php
namespace AppModelsScopes;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentScope;
use IlluminateDatabaseEloquentBuilder;
class ActiveScope implements Scope
{
public function apply(Builder $query, Model $model)
{
$query->where('active', true);
}
}
?>
Теперь применим эту область видимости к модели User:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use AppModelsScopesActiveScope;
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
?>
Теперь все запросы к модели User будут автоматически фильтровать только активных пользователей:
<?php
namespace AppHttpControllers;
use AppModelsUser;
class UserController extends Controller
{
public function index()
{
$users = User::where('age', '>', 18)->get();
foreach ($users as $user) {
echo $user->name;
}
}
}
?>
Результат выполнения кода:
["user 2", "user 4", "user 6"]
Смотрите также
-
метод
withoutGlobalScope,
который отключает глобальную область видимости -
метод
boot,
который используется для инициализации модели -
метод
query,
который возвращает построитель запросов модели -
метод
get,
который выполняет запрос и возвращает коллекцию