В Laravel «область действия» относится к функции, которая позволяет вам определять ограничения многократного использования запросов для ваших моделей Eloquent. Области позволяют инкапсулировать общую логику запросов в методы, которые можно применять к запросам, что делает ваш код более организованным и простым в обслуживании.
Вот несколько методов, которые вы можете использовать для определения и использования областей видимости в Laravel, а также примеры кода:
- Глобальные области:
Глобальные области автоматически применяются ко всем запросам для данной модели. Вы можете определить глобальные области, реализовав интерфейс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.
- Локальные области.
Локальные области позволяют определять ограничения запроса, которые можно применять выборочно в зависимости от ваших потребностей. Вы можете определить локальные области как методы в вашей модели Eloquent. Вот пример:
class Post extends Model
{
public function scopePopular($query)
{
return $query->where('views', '>', 1000);
}
}
В этом примере область действия popularопределяется в модели Post. Он добавляет ограничение на получение только сообщений с более чем 1000 просмотрами. Вы можете использовать эту область следующим образом:
$popularPosts = Post::popular()->get();
При этом будут извлечены все публикации, соответствующие критериям, определенным в области popular.
- Динамические области.
Динамические области аналогичны локальным областям, но позволяют передавать параметры для настройки ограничений запроса. Вот пример:
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.