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()直接電話していないので、あなたの場合、それを機能させるにはもう少し必要です。

$touchesmodel属性で触れるべき関係を指定します。リレーションシップはクエリ ビルダー オブジェクトを返します。私がどこに行くのか分かりますか?

protected $touches = ['recipes'];

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

それがアプリケーションの残りの部分を台無しにする場合は、タッチ専用の新しい関係を作成するだけです (heh :)

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 に答える