make:scope
Команда make:scope используется для создания нового класса локального скоупа в Laravel. Локальные скоупы позволяют инкапсулировать логику часто используемых запросов в модели Eloquent. Команда принимает один обязательный параметр - имя скоупа, которое должно заканчиваться на слово 'Scope'.
Синтаксис
php artisan make:scope ИмяScope
После выполнения команды будет создан файл в директории app/Models/Scopes. В этом классе необходимо определить метод apply, который будет применять условия к запросу.
Пример
Давайте создадим скоуп для фильтрации только опубликованных постов:
<?php
namespace AppModelsScopes;
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('is_published', true);
}
}
?>
Теперь применим созданный скоуп к модели Post:
<?php
namespace AppModels;
use Illuminate\Database\Eloquent\Model;
use AppModelsScopes\PublishedScope;
class Post extends Model
{
protected static function booted()
{
static::addGlobalScope(new PublishedScope);
}
}
?>
Теперь при запросе всех постов будут возвращаться только опубликованные:
<?php
use AppModelsPost;
$posts = Post::all();
foreach ($posts as $post) {
echo $post->title;
}
?>
Результат выполнения кода:
"Post 1"
"Post 2"
"Post 3"
Пример
Давайте создадим скоуп для выборки постов за последнюю неделю:
<?php
namespace AppModelsScopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class LastWeekScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('created_at', '>=', now()->subWeek());
}
}
?>
Применим этот скоуп в запросе:
<?php
use AppModelsPost;
use AppModelsScopes\LastWeekScope;
$posts = Post::withoutGlobalScopes()
->withGlobalScope('last_week', new LastWeekScope)
->get();
foreach ($posts as $post) {
echo $post->title;
}
?>
Результат выполнения кода:
"New Post 1"
"New Post 2"
Пример
Создадим динамический скоуп, который принимает параметры:
<?php
namespace AppModelsScopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class OrderByScope implements Scope
{
protected $column;
protected $direction;
public function __construct($column = 'id', $direction = 'asc')
{
$this->column = $column;
$this->direction = $direction;
}
public function apply(Builder $builder, Model $model)
{
$builder->orderBy($this->column, $this->direction);
}
}
?>
Применим динамический скоуп с разными параметрами:
<?php
use AppModelsPost;
use AppModelsScopes\OrderByScope;
$postsByDate = Post::withoutGlobalScopes()
->withGlobalScope('order_by_date', new OrderByScope('created_at', 'desc'))
->get();
$postsByTitle = Post::withoutGlobalScopes()
->withGlobalScope('order_by_title', new OrderByScope('title', 'asc'))
->get();
echo "Posts by date: " . count($postsByDate);
echo "Posts by title: " . count($postsByTitle);
?>
Результат выполнения кода:
"Posts by date: 5"
"Posts by title: 5"
Смотрите также
-
команда
make:model,
которая создаёт новую модель Eloquent -
команда
make:controller,
которая создаёт новый контроллер -
команда
make:command,
которая создаёт новую консольную команду -
команда
make:enum,
которая создаёт новый класс перечисления