Метод withoutGlobalScope
Метод withoutGlobalScope применяется к запросу Eloquent для исключения определённой глобальной области видимости из текущего запроса. Первым параметром передаётся имя класса области видимости или строка с именем области. Метод возвращает тот же запрос, но уже без учёта исключённой области.
Синтаксис
<?php
Model::withoutGlobalScope($scopeClass);
?>
Пример
Допустим, у нас есть модель Article с глобальной областью видимости, которая выбирает только опубликованные статьи. Отключим эту область, чтобы получить все статьи, включая черновики:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentBuilder;
class Article extends Model
{
protected static function booted()
{
static::addGlobalScope('published', function (Builder $builder) {
$builder->where('status', 'published');
});
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::withoutGlobalScope('published')->get();
foreach ($articles as $article) {
echo $article->title . ' - ' . $article->status;
}
}
}
?>
Результат выполнения кода:
"Article 1 - published"
"Article 2 - draft"
"Article 3 - published"
"Article 4 - draft"
Пример
Если глобальная область видимости задана через отдельный класс, её можно отключить, передав имя класса:
<?php
namespace AppModelsScopes;
use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentScope;
class PublishedScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('status', 'published');
}
}
?>
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use AppModelsScopesPublishedScope;
class Article extends Model
{
protected static function booted()
{
static::addGlobalScope(new PublishedScope);
}
}
?>
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppModelsScopesPublishedScope;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::withoutGlobalScope(PublishedScope::class)->get();
foreach ($articles as $article) {
echo $article->title . ' - ' . $article->status;
}
}
}
?>
Результат выполнения кода:
"Article 1 - published"
"Article 2 - draft"
"Article 3 - published"
"Article 4 - draft"
Пример
Метод withoutGlobalScope можно использовать для отключения сразу нескольких глобальных областей видимости, передавая массив имён или классов:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use AppModelsScopesPublishedScope;
use AppModelsScopesRecentScope;
class ArticleController extends Controller
{
public function index()
{
$articles = Article::withoutGlobalScope([
PublishedScope::class,
RecentScope::class
])->get();
foreach ($articles as $article) {
echo $article->title;
}
}
}
?>
Результат выполнения кода:
"Article 1"
"Article 2"
"Article 3"
"Article 4"
"Article 5"
Смотрите также
-
метод
addGlobalScope,
который добавляет глобальную область видимости -
метод
withoutGlobalScopes,
который отключает все глобальные области видимости -
метод
withTrashed,
который включает мягко удалённые записи -
метод
get,
который выполняет запрос и возвращает коллекцию