Laravelモデルスコープ-クエリステートメントをより直感的にする

グローバルスコープ

コントローラ、テンプレートファイル、またはコマンドラインメソッドのいずれかで、一部のデータベースクエリ操作に繰り返し使用要件があるとします。モデルに共通のメソッドがある場合、これらのフィルタ条件はデフォルトで追加されます。コードの量を大幅に削減します。

たとえば、クエリ条件があります。

$publishedEvents = Event::where('published', '=', 1)->get();

//SQL语句:
SELECT * FROM events WHERE `published` = 1;

公開された条件= 1をデフォルトでオンにする必要がある場合は、laravelモデルのグローバルスコープメソッドを使用して、この条件をすべてのクエリに追加できます。

次のクラスをモデルファイルイベントの先頭に導入します。

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

モデルクラス内で、bootメソッドを手動で実装します。

protected static function boot()
{
    
    
    parent::boot();
    static::addGlobalScope('published', function (Builder $builder) {
    
    
        $builder->where('published', '=', 1);
    });
}

このように、published = 1のSQLステートメントは、QueryBuilderオブジェクトが作成および生成されている限り、すべてのモデルクエリメソッドに追加されます。この制約ステートメントが添付されます。
したがって、この制約ステートメントが必要ない場合、モデルでさえ失われることはないのではないでしょうか。いいえ、これはQueryBuilderの属性配列の要素にすぎません。手動で削除して、特殊なケースの問題を解決してください。早くやれよ:

$events = Event::withoutGlobalScopes()->get();

ローカルスコープ

問題を解決するには、限られたスコープを使用する方がよい場合があります。そのため、ローカルスコープが誕生しました。特定のモデルファイルに特別に使用されるメソッドは、手動で呼び出すと機能します。呼び出されない場合、アクティブに追加されません。

次の例に示すように、laravelの文法規則に従っている限り、ローカルスコープを宣言します。

public function scopePublished($query)
{
    
    
    return $query->where('published', 1);
}

スコープが先頭にある小さなキャメルケースで名前が付けられた関数メソッドを宣言し、QueryBuilderオブジェクトインスタンスを返すだけです。呼び出すときに手動で追加します。

$events = Event::published()->get();

publication()メソッドはscopePublishedメソッドにマップされます。

上記のデモコードはユーザー入力を受け取りません。パラメータを使用した転送方法を示しましょう。たとえば、次のようなクエリ要件があります。

$events = Event::where('zip', $zipCode)->get();

ローカルスコープを使用して、次のことを実現します。

public function scopeZip($query, $zip)
{
    
    
    return $query->where('zip', $zip);
}

場所に応じて渡すだけです。使用の使用は、直接渡します:

$zip = '43016';
$events = Event::zip($zip)->get();

これでローカルスコープの使用は完了ですが、直感的ですか?

ローカルスコープはQueryBuilderのインスタンスを返すため、ローカルスコープのメソッドとQueryBuilderのメソッドをチェーンで呼び出すのは自然なことです。ローカルスコープメソッドを宣言します。

public function scopeAttendees($query, $maximum)
{
    
    
    return $query->where('max_attendees', $maximum);
}

次に、上記の2つの方法を連続して使用します。

$events = Event::zip(43016)->attendees(2)->get();

//SQL语句:
SELECT * FROM events WHERE zip = '43016' and max_attendees = '2';

再版:3分の短い記事:Laravelモデルスコープ、より多くのコードを「保存」

おすすめ

転載: blog.csdn.net/qq_39004843/article/details/109032956