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