Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何暂时关闭laravel垃圾过滤器?_Laravel_Laravel 5_Soft Delete - Fatal编程技术网

如何暂时关闭laravel垃圾过滤器?

如何暂时关闭laravel垃圾过滤器?,laravel,laravel-5,soft-delete,Laravel,Laravel 5,Soft Delete,假设我有一个A,它有一个B,它有一个C,它有一个D。我想从A转到D,但是任何一个(或所有)对象都可能被删除了。所以我必须这样做: $d = $a->b()->withTrashed()->first()->c()->withTrashed()->first()->d()->withTrashed()->first() 这太可怕了。我真的宁愿这样做: turnOffTrashedFilter(); $d = $a->b->c-&g

假设我有一个A,它有一个B,它有一个C,它有一个D。我想从A转到D,但是任何一个(或所有)对象都可能被删除了。所以我必须这样做:

$d = $a->b()->withTrashed()->first()->c()->withTrashed()->first()->d()->withTrashed()->first()
这太可怕了。我真的宁愿这样做:

turnOffTrashedFilter();
$d = $a->b->c->d;
拉威尔有这样的能力吗

请注意,这只是一个示例—引发此问题的情况实际上要复杂得多,各种调用嵌套在其他调用中,因此实际上不可能像上面那样使用withTrashed。我需要在请求期间关闭过滤器,而不必修改大量代码以合并两个并行路径。

没有内置的,但可以这样做 没有内置的方法来禁用自动软删除过滤。然而,这是可能的。软删除筛选器是一个全局作用域,添加到类的引导方法中。可以按如下方式将其移除:

    \Event::listen('eloquent.booted:*', function($name) {
    $name = substr($name, 17); // event name is "eloquent.booted: some/class"
    $class = new \ReflectionClass($name);
    $prop = $class->getProperty('globalScopes');
    $prop->setAccessible(true);
    $scopes = $prop->getValue();
    foreach ($scopes as $c => &$s) {
        unset($s['Illuminate\Database\Eloquent\SoftDeletingScope']);
    }
    $prop->setValue($scopes);
});

这将钩住引导事件,该事件在全局作用域添加到类后立即触发。然后,它打开(私有静态)属性globalScopes,这是一个附加全局作用域的列表,并删除软删除作用域。这将防止将softdelete作用域附加到任何模型,前提是在添加事件侦听器后调用它们的静态启动方法。

您可以在关系中使用withTrashed():

public function aTrashed()
{
    return $this->hasOne(A::class)->withTrashed();
}

public function bTrashed()
{
    return $this->hasMany(B::class)->withTrashed();
}

public function cTrashed()
{
    return $this->belongsToMany(C:class)->withTrashed();
}

// Then use it
$d = $z->aTrashed->bTrashed->cTrashed;

每件物品有两个关系,一个有垃圾,一个没有。然后你可以根据需要使用它们。你可以创建一个模型函数,这样你只需编写一次。我认为,每次选择
withTrashed
都应该是明确的,这样就可以清楚地知道你在做什么,并防止在代码中忘记打开trashed过滤器时出现问题。@Indra建议的是一个很好的折衷方案,以充分利用两者worlds@Indra,在我的例子中,这是一个很好的解决方案,但它并没有回答我的问题-我特别想问的是,是否有一种方法可以关闭过滤,但可能没有,但是添加一堆新方法是最后的解决办法。@apokryfos这在一般情况下是绝对正确的,不幸的是,我正在处理的这个泥球是这样写的,每次调用显式调用withTrashed实际上会让它变得不那么清晰。