Для поддержания чистоты и единообразия запросов часто использую глобальные области видимости (Global Scopes) в моделях. Например, в приложении может быть автоматическое исключение архивных записей компаний из всех выборок, что помогает избежать случайного обращения к неактивным данным.
// Создание области видимости для исключения архивных компаний
class ExcludeArchivedScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where(
'status', '<>',
CompanyStatusEnum::ARCHIVED->value
);
}
}
/*
Добавление `addGlobalScope()` к нужной модели. Этот метод используется для применения глобальной области видимости к модели. Это означает, что каждый раз при запросе к модели (например, через `Company::all()` или `Company::where(...)`), условия области видимости автоматически добавляются в конструктор запросов, фильтруя результаты без необходимости вручную добавлять их каждый раз.
*/
class Company extends BaseModel
{
protected static function booted()
{
static::addGlobalScope(new ExcludeArchivedScope());
}
}
// Временное отключение ВСЕХ областей видимости
Company::withoutGlobalScopes()->find($id);
// Временное отключение только области видимости
Company::withoutGlobalScope(ExcludeArchivedScope::class)->find($id);
Примечательно, что при необходимости такую область видимости можно точечно отключить для конкретного запроса, сохраняя гибкость работы с данными.
📱 @dev_notes_ru
#Laravel #LaravelTips #PHP #Eloquent