Laravel Eloquent の クエリ スコープ 機能を使用すると、再帰クエリをメソッドに保存してコードを再利用できるようになります。これにより、特に同じ種類のクエリが何度も必要な場合に、コードがわかりやすく分かりやすくなります。 クエリ スコープは、一般的なクエリをメソッドとして定義し、モデル全体で使用できます。
グローバル スコープ は常にモデルにアタッチされます。 このスコープはモデルを使用すると自動的に機能するため、毎回記述する必要はありません。 通常、ログインステータスやアクティブな記録などを確認するために使用されます。
1. グローバル スコープ クラスの作成:
Laravel で グローバル スコープ を作成するには、Scope
インターフェイスを実装するクラスが使用されます。
<code class="language-php">use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class ActiveScope implements Scope { public function apply(Builder $builder, Model $model) { $builder->where('active', 1); // সক্রিয় ফিল্টার } }</code>
2. グローバル スコープをモデルにアタッチします:
これはモデルの booted()
メソッドに追加する必要があります。
<code class="language-php">use App\Models\Post; use App\Scopes\ActiveScope; class Post extends Model { protected static function booted() { static::addGlobalScope(new ActiveScope); } }</code>
Post::all()
を使用すると、active = 1
フィルターが自動的に適用されます。
3. グローバル スコープを一時的に省略しています:
<code class="language-php">use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class ActiveScope implements Scope { public function apply(Builder $builder, Model $model) { $builder->where('active', 1); // সক্রিয় ফিল্টার } }</code>
これにより、グローバル スコープが一時的に削除され、active
フィルターを除くすべての投稿が返されます。
ローカル スコープ は、モデル内の特定のクエリ スコープとして機能し、明示的に呼び出した場合にのみ適用されます。 グローバル スコープのように、すべてのクエリ中に自動的に適用されるわけではありません。
最初の引数 Builder
が入力となるパブリック メソッドをモデルに追加して、ローカル スコープを作成します。
<code class="language-php">use App\Models\Post; use App\Scopes\ActiveScope; class Post extends Model { protected static function booted() { static::addGlobalScope(new ActiveScope); } }</code>
<code class="language-php">$posts = Post::withoutGlobalScope(ActiveScope::class)->get();</code>
パラメータはローカル スコープに渡すことができます。
<code class="language-php">use App\Models\Post; class Post extends Model { // লোকাল স্কোপ public function scopeActive($query) { return $query->where('active', 1); } public function scopeDraft($query) { return $query->where('status', 'draft'); } }</code>
スコープを status
パラメータで使用できるようになりました:
<code class="language-php">// সক্রিয় পোস্ট পেতে: $posts = Post::active()->get(); // ড্রাফট পোস্ট পেতে: $draftPosts = Post::draft()->get(); // চেইন করে ব্যবহার: $activeDraftPosts = Post::active()->draft()->get();</code>
'published' はパラメータです。
ダイナミック スコープ はローカル スコープの一種で、スコープ名を動的に呼び出すことができます。 Laravel では、scopeName()
型名の使用が許可されています。
<code class="language-php">class Post extends Model { // লোকাল স্কোপ public function scopeStatus($query, $status) { return $query->where('status', $status); } }</code>
スコープを動的に呼び出すことができるようになりました:
<code class="language-php">$posts = Post::status('published')->get();</code>
これは scopePublished()
メソッドと同じように機能します。
複数のスコープをチェーンすることができます。 たとえば、status
スコープと active
スコープは一緒に使用できます。
<code class="language-php">use Illuminate\Database\Eloquent\Scope; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder; class ActiveScope implements Scope { public function apply(Builder $builder, Model $model) { $builder->where('active', 1); // সক্রিয় ফিল্টার } }</code>
これは active
と status('published')
の両方に適用されます。
Eloquent の ローカル スコープ はチェーン可能です。つまり、複数のスコープを同時に使用できます。
<code class="language-php">use App\Models\Post; use App\Scopes\ActiveScope; class Post extends Model { protected static function booted() { static::addGlobalScope(new ActiveScope); } }</code>
3 つのスコープと 1 つの orderBy
チェーンがあります。
以上がLaravel Eloquent ORM (バングラ語パートクエリスコープ)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。