2017-05-31 1 views
3

現在、私のLaravelモデルでコードをクリーンアップしようとしていますが、現時点では、各モデルのローカルスコープで多くのコードを複製しています。それぞれのモデルには類似した列がたくさんあり、これらのスコープをどのように1つの場所に置くことができるかを考えていますが、$table変数を渡して動的に使用できるようにしています。私は現在、ラーベールの親モデルにスコープを追加する

public function scopeName($query, $name) 
{ 
    return $query->where($this->table.'name', $name); 
} 

public function scopeStatus($query, $status) 
{ 
    return $query->where($this->table.'.status', $status); 
} 

例えばいくつかのモデルでは、私はこれらの共通のスコープを取ると、私はそれにテーブルを渡すことができますし、私は、コードを排除することができ、単一のクラスでそれらを持っていると思いますしている何

複製。親モデルを拡張するのと同様のものを見つけることができませんでした。私はグローバルスコープについても認識していますが、同様の問題が発生します。ここでは、それぞれのモデルにstatic::addGlobalScope(new StatusScope)と入力しています。

ご協力いただきまして誠にありがとうございます。

ここでは特性を悪いと見なしますか?

答えて

5

形質は続きを読む、ここで継承よりも優れている:https://en.wikipedia.org/wiki/Composition_over_inheritance

あなたはそれのために新しい形質を作成することができます。

trait CommonScopesTrait 
{ 
public function scopeName($query, $name) 
    { 
     return $query->where($this->table.'name', $name); 
    } 

    public function scopeStatus($query, $status) 
    { 
     return $query->where($this->table.'.status', $status); 
    } 
} 

そして、あなたのモデル(複数可)でそれを使用します。

class YourModel extends Model 
{ 
    use CommonScopesTrait; 
} 
+0

はい!ローカルスコープを使用するかグローバルスコープを作成する場合でも、それを適用するための特性は正しい方法です。ソフト削除機能を使用して、ソフト削除をモデルに適用する方法を見てみましょう。あなたは、コードの重複を排除するために必要です。がんばろう! – larsemil

2

lptnの回答に加えて、別のオプションもあります。

あなたが雄弁に及ぶ基本的なモデルを作成します。あなたはそれらのメソッドが使用可能になりますので、BasicScopeモデルに独自のモデルを拡張し、その後

class BasicScope extends Eloquent { 
    public function scopeName($query, $name) 
    { 
     return $query->where($this->table.'name', $name); 
    } 

    public function scopeStatus($query, $status) 
    { 
     return $query->where($this->table.'.status', $status); 
    } 
} 

をそして:

class User extends BasicScope { 

} 
関連する問題