Laravel全局查询范围的withoutGlobalScope()不返回所需的记录

时间:2018-06-06 06:37:08

标签: php laravel

我有一个名为ArchiveScope的全局查询范围,它模仿了Soft Deletion的类似功能。该范围的apply方法如下所示:

public function apply(Builder $builder, Model $model)
{
    $builder->where('archived_at', '=', NULL);
}

因此,当我使用MyModel::all()时,它会返回所有没有时间戳的行(即NULL)。但是当我想获取所有记录(包括存档)时,我仍然得到相同的结果。我在修补程序中运行此语句:

App\MyModel::withoutGlobalScope(ArchiveScope::class)->get();

奇怪的是,当我使用withoutGlobalScopes()代替withoutGlobalScope(ArchiveScope::class)时,我会获得所有记录。

App\MyModel::withoutGlobalScopes()->get();

3 个答案:

答案 0 :(得分:2)

定义完整的类路径可以解决问题:

App\MyModel::withoutGlobalScope('App\Scopes\ArchiveScope')->get();

答案 1 :(得分:0)

我只声明了类引用就解决了这个问题

use App \ Scopes \ NomeScope;


$a = Model::withoutGlobalScope(NomeScope::class)->get();

答案 2 :(得分:-1)

和其他人一样,我通过使用全命名空间解决了这个问题,但是很长一段时间以来,我并不是很明显。

我正在使用

StoreItem::withoutGlobalScope(App\Scopes\CompletedStoreItems::class)->where('id',$id)->get();

如果我将其复制并粘贴到 tinker 中,它会起作用,但在我的代码中不起作用。结果是因为我在 \ 之前没有 App 它实际上正在寻找

App\Models\App\Scopes\CompletedStoreItems

这是错误的并且很难调试。

确保将 \ 放在 App 之前

ps。上面 Tanmay 的代码有效,因为他使用的是字符串。

相关问题