2016-09-01 3 views
1

ダイナミッククエリパラメータでグローバルスコープを使用する際に問題が発生しています。グローバルスコープはマネージャIDに基づいていますが、$ modelは空です。$ thisはモデルではなくマネージャスコープを参照します。したがって、$ this-> idは未定義のプロパティです。このような何かを行うにはそこに方法がある:Laravel 5動的パラメータを使用するグローバルスコープ

public function apply(Builder $builder, Model $model) 
{ 
    return $builder->where('manager', $model->id); // $this->id 
} 

私は$modelがマネージャモデルであるために仮定されていることを仮定しているが、それは空で、私はそれ上の任意のドキュメントを見つけることができませんので、私はありません誰かが私がそれを感謝するコメントで私に教えることができれば完全に確かです。これは、マネージャモデルでは、当社のグローバルスコープ方法である:

protected static function boot() 
{ 
    parent::boot(); 

    static::addGlobalScope(new ManagerScope); 
} 

グローバルスコープが明示的な方法を適用する必要はありませんので、私はブートに何かを追加することなどの追加のパラメータの何かのためにできる可能性があるかもしれないと思った。

protected static function boot() 
{ 
    parent::boot(); 

    static::addGlobalScope(new ManagerScope($this->id); 
} 

これは静的メソッドでは許可されていませんが、これはエラーを見た後には意味があります。

答えて

2

自然にグローバルスコープが自動的に適用されるため、パラメータを直接渡すことはできません。

したがって、あなたが

public function scopeForManager($query, $manager) 
{ 
    return $query->where('manager', $manager->id); 
} 

Document::forManager($manager)->all(); 

またはマネージャ情報は、グローバル状態(セッション)のいくつかの種類で使用可能な場合は、IMOより理にかなってダイナミックローカルスコープ、に固執するか、あなたには、いくつかを作成することができますManagerResolverクラスの一種

class ManagerScope 
{ 
    protected $resolver; 

    public function __construct(ManagerResolver $resolver) 
    { 
     $this->resolver = $resolver 
    } 

    public function apply(Builder $builder, Model $model) 
    { 
     return $builder->where('manager', $this->resolver->getManagerId()); 
    }  
} 

とあなたのスコープに、そのインスタンスを渡す

protected static function boot() 
{ 
    parent::boot(); 
    static::addGlobalScope(new ManagerScope(new ManagerResolver()); 
} 
+0

ありがとうございます。実際には、現在認証されているユーザ(この場合はマネージャ)をミドルウェアのトークンから取得するために使用される遅延サービスプロバイダがあります。ローカルスコープを使用したくない理由は、開発者の間違いを避けることでした。なぜなら、それはアプリケーションのセキュリティ上の問題になるからです。しかし、それは申請者の関係に直接つながる可能性があります。あなたは$モデルをどのように使うべきか説明できますか?私は理にかなった例を見つけることができません。 – mtpultz

+2

組み込みの 'SoftDeletingScope'は、モデルデータを保持するテーブルの' 'deleted_at'"カラムの完全修飾名を調べるために '$ model'が使われる良い例です。モデル内のその列の名前。 – peterm

+0

それはどんな方法で助けましたか? – peterm

関連する問題