Концептуальная проблема:
У меня очень простая проблема при использовании 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());
}
}
Если вы хотите явно избежать глобальной области действия для данного запроса, вы можете использовать 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();
}
Других решений пока нет …