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 個作用域和一個 orderBy
鍊式作用域。
以上是Bangla 部分查詢範圍中的 Laravel Eloquent ORM)的詳細內容。更多資訊請關注PHP中文網其他相關文章!