7

概念问题: 我在使用touches属性时有一个非常简单的问题,即自动更新依赖模型上的时间戳;它正确地这样做了,但也应用了全局范围。

有什么办法可以关闭这个功能吗?或者专门要求自动 touches忽略全局范围?


具体示例:更新成分模型时,应触及所有相关配方。这很好用,除了我们有一个globalScope用于根据语言环境分离配方的方法,它在应用触摸时也会使用。


成分型号:

class Ingredient extends Model
{
    protected $touches = ['recipes'];

    public function recipes() {
        return $this->belongsToMany(Recipe::class);
    }

}

配方模型:

class Recipe extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new LocaleScope);
    }

    public function ingredients()
    {
        return $this->hasMany(Ingredient::class);
    }
}

区域设置范围:

class LocaleScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $locale = app(Locale::class);

        return $builder->where('locale', '=', $locale->getLocale());
    }

}
4

2 回答 2

21

如果您想明确避免给定查询的全局范围,您可以使用该withoutGlobalScope()方法。该方法接受全局范围的类名作为其唯一参数。

$ingredient->withoutGlobalScope(LocaleScope::class)->touch();
$ingredient->withoutGlobalScopes()->touch();

由于您不是touch()直接致电,因此在您的情况下,需要更多时间才能使其正常工作。

您指定应该在模型$touches属性中触及的关系。关系返回查询构建器对象。看看我要去哪里?

protected $touches = ['recipes'];

public function recipes() {
   return $this->belongsToMany(Recipe::class)->withoutGlobalScopes();
}

如果这与您的应用程序的其余部分混淆,只需创建一个专门用于触摸的新关系(呵呵 :)

protected $touches = ['recipesToTouch'];

public function recipes() {
   return $this->belongsToMany(Recipe::class);
}

public function recipesToTouch() {
   return $this->recipes()->withoutGlobalScopes();
}
于 2016-09-14T13:18:05.820 回答
-2

您可以在模型中定义关系并将参数传递给它,如下所示:

public function recipes($isWithScope=true)
{
    if($isWithScope)
        return $this->belongsToMany(Recipe::class);
    else
        return $this->recipes()->withoutGlobalScopes();
}

recipes->get();然后像这样使用它recipes(false)->get();

于 2022-01-31T12:01:48.563 回答