Query Scopes در لاراول یکی از ویژگیهای قدرتمند Eloquent هستند که به شما این امکان را میدهند تا کدهای مربوط به پرسوجوهای تکراری را در مدلها به صورت جداگانه تعریف کنید و سپس از آنها در هر جایی از برنامه استفاده کنید. با استفاده از Query Scopes، میتوانید شرایط خاصی را به راحتی به کوئریها اضافه کنید.
Query Scopes به دو نوع تقسیم میشوند:
-
Global Scopes (حالت سراسری)
-
Local Scopes (حالت محلی)
⚡ Local Scopes (حالت محلی)
Local Scopes به شما این امکان را میدهند که متدهای عمومی برای اعمال شرایط خاص به کوئریها در مدلها تعریف کنید. این متدها میتوانند به راحتی در کوئریهای Eloquent شما استفاده شوند.
ایجاد یک Local Scope
برای ایجاد یک Local Scope در لاراول، کافی است یک متد در مدل خود ایجاد کنید که معمولاً به صورت scope با نامی که میخواهید در کوئری استفاده کنید، نامگذاری میشود. برای مثال، اگر بخواهید یک scope برای فیلتر کردن کاربران فعال ایجاد کنید، میتوانید اینگونه عمل کنید:
1. تعریف Local Scope
در اینجا، متد scopeActive به شما این امکان را میدهد که کاربران فعال را از کوئریهای خود فیلتر کنید.
2. استفاده از Local Scope
پس از تعریف scope، میتوانید از آن در کوئریهای خود استفاده کنید:
در اینجا، با استفاده از User::active()، کوئری فیلتر شده برای دریافت کاربران فعال اجرا میشود.
3. چندین Scope به طور همزمان
شما میتوانید چندین scope را به طور همزمان در یک کوئری استفاده کنید:
این کوئری کاربران فعال را که در شهر نیویورک هستند، برمیگرداند.
⚡ Global Scopes (حالت سراسری)
Global Scopes برای اعمال شرایط به تمامی کوئریها به طور پیشفرض استفاده میشوند. برای مثال، ممکن است بخواهید یک شرط کلی را به تمام کوئریهای یک مدل اضافه کنید، مانند فیلتر کردن رکوردهای حذف شده.
ایجاد یک Global Scope
برای ایجاد یک Global Scope، شما باید یک کلاس جدید تعریف کرده و از رابط Scope لاراول استفاده کنید.
1. تعریف Global Scope
ابتدا باید یک کلاس برای scope خود بسازید. به عنوان مثال، اگر بخواهید رکوردهای حذف شده را همیشه فیلتر کنید، میتوانید یک scope به این صورت تعریف کنید:
2. استفاده از Global Scope در مدل
پس از تعریف scope، شما باید آن را در مدل خود ثبت کنید تا به تمامی کوئریها اعمال شود.
در اینجا، ActiveScope بهطور خودکار به تمام کوئریهای User اعمال میشود.
3. حذف Global Scope
اگر بخواهید در یک کوئری خاص، scope را حذف کنید، میتوانید از متد withoutGlobalScope() استفاده کنید:
⚡ Query Scopes در عمل
1. استفاده از Local Scope در یک پروژه
فرض کنید که یک مدل Post دارید و میخواهید مقالات منتشر شده را فیلتر کنید. ابتدا یک Local Scope به نام scopePublished ایجاد میکنید:
سپس، میتوانید از این scope در هر جایی از پروژه خود استفاده کنید:
2. استفاده از Global Scope در یک پروژه
فرض کنید که میخواهید به طور پیشفرض همهی رکوردها را فیلتر کنید که حذف شده نباشند (مثلاً فیلتر کردن رکوردهای با ستون deleted_at).
اول، یک کلاس Global Scope به نام NonDeletedScope میسازید:
سپس در مدل Post آن را ثبت میکنید:
حالا، همهی کوئریهایی که برای مدل Post اجرا میکنید، بهطور خودکار رکوردهای حذف شده را فیلتر میکنند.
📋 جمعبندی
-
Local Scopes: متدهایی هستند که میتوانند بهطور انتخابی به کوئریها اضافه شوند.
-
تعریف میشوند با استفاده از متد
scope{ScopeName}در مدل. -
میتوانید از آنها به راحتی در کوئریهای خود استفاده کنید.
-
-
Global Scopes: شرایطی هستند که به تمامی کوئریها بهطور پیشفرض اعمال میشوند.
-
تعریف میشوند با استفاده از یک کلاس جداگانه و پیادهسازی رابط
Scope. -
برای ثبت آنها باید از متد
addGlobalScope()استفاده کنید.
-
-
حذف Global Scopes: میتوانید از متد
withoutGlobalScope()برای حذف scope در کوئریهای خاص استفاده کنید.
Query Scopes در لاراول ابزار قدرتمندی برای مدیریت کوئریهای پیچیده هستند و میتوانند به شما کمک کنند که کدهای خود را تمیزتر، قابل نگهداریتر و مقیاسپذیرتر بنویسید.