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中文网其他相关文章!