РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1322 of 1392 menu

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,
    которая создаёт новый класс перечисления
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить