在没有全局范围的情况下使用Laravel触摸

时间:2016-09-14 12:53:15

标签: php laravel global-scope

概念问题: 使用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());
    }

}

1 个答案:

答案 0 :(得分:5)

如果要明确避免给定查询的全局范围,可以使用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();
}