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