Изучение областей видимости в Laravel: методы и примеры кода

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

Вот несколько методов, которые вы можете использовать для определения и использования областей видимости в Laravel, а также примеры кода:

  1. Глобальные области:
    Глобальные области автоматически применяются ко всем запросам для данной модели. Вы можете определить глобальные области, реализовав интерфейс Illuminate\Database\Eloquent\Scope. Вот пример:
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);
    }
}
class Post extends Model
{
    protected static function booted()
    {
        static::addGlobalScope(new PublishedScope);
    }
}

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

  1. Локальные области.
    Локальные области позволяют определять ограничения запроса, которые можно применять выборочно в зависимости от ваших потребностей. Вы можете определить локальные области как методы в вашей модели Eloquent. Вот пример:
class Post extends Model
{
    public function scopePopular($query)
    {
        return $query->where('views', '>', 1000);
    }
}

В этом примере область действия popularопределяется в модели Post. Он добавляет ограничение на получение только сообщений с более чем 1000 просмотрами. Вы можете использовать эту область следующим образом:

$popularPosts = Post::popular()->get();

При этом будут извлечены все публикации, соответствующие критериям, определенным в области popular.

  1. Динамические области.
    Динамические области аналогичны локальным областям, но позволяют передавать параметры для настройки ограничений запроса. Вот пример:
class Post extends Model
{
    public function scopeByAuthor($query, $authorId)
    {
        return $query->where('author_id', $authorId);
    }
}

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

$authorId = 1;
$authorPosts = Post::byAuthor($authorId)->get();

При этом будут получены все сообщения, написанные автором с идентификатором 1.