بخش چهارم - اسکوپ ها
اسکوپها (Scopes) در لاراول به شما اجازه میدهند که منطق جستجو یا کوئریهای پیچیدهای را به صورت توابع قابل استفاده مجدد تعریف کنید. این اسکوپها به شما کمک میکنند که کوئریهای مشابه را در سراسر برنامه به راحتی مدیریت کنید. اسکوپها به دو دسته اصلی تقسیم میشوند:
1- Local Scopes (اسکوپهای محلی)
2- Global Scopes (اسکوپهای سراسری)
اسکوپهای محلی به شما اجازه میدهند که منطق فیلتر کردن را در یک تابع درون مدل تعریف کنید و سپس آن را در هر کوئری که به مدل مربوط میشود، بهراحتی فراخوانی کنید.
اسکوپهای محلی به عنوان متدهایی در مدل تعریف میشوند و با کلمه scope شروع میشوند. برای استفاده از آنها نیازی به نوشتن scope در هنگام فراخوانی نیست.
فرض کنید یک جدول کاربران داریم که دارای یک ستون active است. میخواهیم کاربران فعال را با استفاده از یک اسکوپ بازیابی کنیم.
class User extends Model
{
public function scopeActive($query)
{
return $query->where('active', 1);
}
}
// Usage:
$activeUsers = User::active()->get();
اسکوپ active فقط کاربران فعال (active = 1) را بازیابی میکند. همانطور که در مثال مشخص است متد اسکوپ با "scope" شروع می شود اما در هنگام استفاده از متد حذف می شود.
پذیرفتن پارامترها در اسکوپهای محلی:
اسکوپهای محلی میتوانند پارامترهای ورودی داشته باشند تا بتوانند بر اساس نیازهای مختلف تنظیم شوند.
class User extends Model
{
public function scopeOlderThan($query, $age)
{
return $query->where('age', '>', $age);
}
}
// Usage:
$users = User::olderThan(25)->get();
———
اسکوپهای سراسری به شما اجازه میدهند که یک محدودیت یا فیلتر را برای تمام کوئریهای یک مدل اعمال کنید. به محض این که یک مدل بارگذاری یا بازیابی میشود، اسکوپ سراسری بهطور خودکار اعمال میشود، مگر اینکه بهصراحت آن را غیرفعال کنید.
برای تعریف یک اسکوپ سراسری، شما باید یک کلاس جدید که از Scope پیروی میکند ایجاد کنید. این کلاس شامل متد apply است که منطق اسکوپ در آن تعریف میشود. می توانید از کامند زیر استفاده کنید:
php artisan make:scope ActiveScope
فرض کنید شما میخواهید فقط کاربران فعال را به صورت پیشفرض نمایش دهید.
ابتدا یک کلاس اسکوپ سراسری ایجاد میکنیم:
class ActiveScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('active', 1);
}
}
سپس باید این اسکوپ سراسری را به مدل مورد نظر اضافه کنیم.
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new ActiveScope);
}
}
حالا هر بار که شما کوئری برای بازیابی کاربران اجرا کنید، این اسکوپ سراسری بهطور خودکار اعمال میشود و فقط کاربران فعال را برمیگرداند.
در برخی موارد ممکن است بخواهید اسکوپ سراسری را برای یک کوئری خاص غیرفعال کنید. برای این کار از متد withoutGlobalScope یا withoutGlobalScopes استفاده میکنید.
// Without ActiveScope
$users = User::withoutGlobalScope(ActiveScope::class)->get();
// Without any global scope
$users = User::withoutGlobalScopes()->get();
شما میتوانید به صورت پویا اسکوپهای سراسری خود را با پارامترهای ورودی تنظیم کنید. برای این کار کافی است اسکوپ سراسری خود را با یک پارامتر سفارشی تعریف کنید.
class AgeScope implements Scope
{
protected $age;
public function __construct($age)
{
$this->age = $age;
}
public function apply(Builder $builder, Model $model)
{
$builder->where('age', '>', $this->age);
}
}
// Usage:
class User extends Model
{
protected static function booted()
{
static::addGlobalScope(new AgeScope(30));
}
}
حالا هر بار که کوئری برای بازیابی کاربران اجرا شود، این اسکوپ اعمال میشود و فقط کاربران با سن بیشتر از 30 نمایش داده میشوند.
به طور کلی اسکوپ های محلی برای تعریف فیلترها یا منطقهای قابل استفاده مجدد به صورت اختیاری استفاده میشود، درصورتی که اسکوپ های سراسری برای اعمال خودکار فیلترها یا محدودیتها روی تمام کوئریها استفاده میشوند.
هر دو نوع اسکوپ به شما کمک میکنند تا کدها را تمیزتر و قابل مدیریتتر کرده و کوئریها را با قابلیت استفاده مجدد و انعطافپذیرتر پیادهسازی کنید.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.