Освоение глобальных областей видимости Laravel: упрощение запросов к базе данных

Приходилось ли вам когда-нибудь повторять одни и те же условия запроса в нескольких запросах в приложении Laravel? Если да, то Laravel Global Scopes здесь, чтобы спасти вас! В этой статье мы рассмотрим возможности глобальных областей Laravel и то, как они могут упростить запросы к базе данных. Мы углубимся в некоторые практические примеры кода и объясним преимущества использования этой функции. Итак, хватайте свой любимый напиток и начнем!

Понимание глобальных областей видимости Laravel.
Глобальные области видимости Laravel предоставляют удобный способ определения ограничений запроса, которые автоматически применяются ко всем запросам для данной модели. Они позволяют инкапсулировать общую логику запросов внутри самой модели, уменьшая дублирование кода и обеспечивая согласованность во всем приложении. Глобальные области особенно полезны для применения условий, которые необходимо соблюдать единообразно во всем проекте.

Создание глобальной области.
Чтобы создать глобальную область, нам нужно определить класс, реализующий интерфейс Illuminate\Database\Eloquent\Scope, и переопределить applyи . 6методов. Метод applyдобавляет к запросу необходимые ограничения, а метод removeудаляет ограничения при необходимости. Давайте рассмотрим пример:

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class PublishedScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('published', true);
    }
    public function remove(Builder $builder, Model $model)
    {
        $query = $builder->getQuery();
        $query->wheres = collect($query->wheres)->reject(function ($where) {
            return $this->isPublishedConstraint($where);
        })->values()->all();
    }
    protected function isPublishedConstraint(array $where)
    {
        return $where['column'] === 'published' && $where['value'] === true;
    }
}

В этом примере мы создали PublishedScope, который применяет ограничение на получение только опубликованных записей. Вы можете определить любые необходимые вам условия в своей глобальной области действия.

Применение глобальных областей:
Чтобы применить глобальную область к модели, нам нужно определить метод bootвнутри модели и вызвать метод addGlobalScope. Давайте посмотрим пример:

use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new PublishedScope);
    }
}

Теперь всякий раз, когда вы запрашиваете модель Post, PublishedScopeавтоматически применяет ограничение для получения только опубликованных сообщений.

Отключение глобальных областей:
Возможны сценарии, в которых вы захотите временно отключить глобальную область для определенного запроса. Для этого в Laravel предусмотрен удобный метод withoutGlobalScope. Вот пример:

$posts = Post::withoutGlobalScope(PublishedScope::class)->get();

В этом случае PublishedScopeбудут временно отключены, и вы будете получать все публикации независимо от их опубликованного статуса.

Удаление глобальных областей:
Если вы хотите полностью удалить глобальную область из модели, вы можете использовать метод removeGlobalScope. Вот пример:

Post::withoutGlobalScope(PublishedScope::class)->get();

В этом случае PublishedScopeбольше не будет применяться ни к каким запросам в модели Post.

Глобальные области видимости Laravel предоставляют фантастический способ упростить запросы к базе данных и устранить дублирование кода. Инкапсулируя общую логику запросов в своих моделях, вы можете обеспечить согласованность результатов во всем приложении. Итак, начните использовать глобальные области видимости в своих проектах Laravel и наслаждайтесь более чистым и удобным в обслуживании кодом!