Laravel Scopes
Laravel Scopes
Laravel Scopes: دليل شامل للمبتدئين
مقدمة
في عالم تطوير تطبيقات الويب باستخدام إطار العمل Laravel، تعتبر عمليات الاستعلام عن البيانات من قاعدة البيانات جزءًا أساسيًا من معظم التطبيقات. Laravel يوفر واجهة أنيقة وبديهية للتعامل مع قاعدة البيانات من خلال نظام [Eloquent ORM]. ولكن، مع تعقيد التطبيقات وزيادة حجم البيانات، قد تصبح الاستعلامات طويلة ومعقدة، مما يؤدي إلى صعوبة صيانتها وقراءتها. هنا يأتي دور [Laravel Scopes].
[Laravel Scopes] هي طريقة قوية لتحديد استعلامات قاعدة البيانات الشائعة وإعادة استخدامها بسهولة. تتيح لك Scopes تجنب تكرار التعليمات البرمجية، وتحسين قابلية القراءة والصيانة، وتسهيل عملية اختبار الاستعلامات. في هذا المقال، سنستكشف [Laravel Scopes] بالتفصيل، بدءًا من المفاهيم الأساسية وصولًا إلى الاستخدامات المتقدمة.
ما هي Laravel Scopes؟
ببساطة، [Laravel Scopes] هي عبارة عن فئات تقوم بتغليف منطق الاستعلام عن البيانات. يمكنك تعريف نطاقات متعددة لكل نموذج Eloquent، وكل نطاق يمثل استعلامًا محددًا. عندما تحتاج إلى تطبيق هذا الاستعلام في مكان آخر في تطبيقك، يمكنك استدعاء النطاق ببساطة، مما يوفر عليك كتابة نفس الاستعلام مرارًا وتكرارًا.
أنواع Laravel Scopes
هناك ثلاثة أنواع رئيسية من [Laravel Scopes] في Laravel:
- Local Scopes: تُعرّف داخل النموذج (Model) نفسه، وتستخدم للاستعلامات التي تتعلق بشكل مباشر بهذا النموذج.
- Global Scopes: تُطبّق على جميع الاستعلامات التي يتم إجراؤها على نموذج معين، بغض النظر عن مكان استدعائها.
- Custom Scope Bindings: تسمح لك بتمرير قيم ديناميكية إلى النطاقات، مما يجعلها أكثر مرونة وقابلية لإعادة الاستخدام.
Local Scopes: النطاقات المحلية
النطاقات المحلية هي أبسط أنواع [Laravel Scopes]. يتم تعريفها كطرق (methods) داخل نموذج Eloquent. اسم الطريقة يمثل اسم النطاق. داخل الطريقة، تقوم بإرجاع كائن الاستعلام (Query Builder) الذي يمثل الاستعلام الذي تريد تنفيذه.
مثال:
```php <?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model {
/** * نطاق للحصول على المنتجات النشطة فقط. * * @return \Illuminate\Database\Eloquent\Builder */ public function scopeActive($query) { return $query->where('is_active', true); }
/** * نطاق للحصول على المنتجات الأكثر مبيعًا. * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $limit * @return \Illuminate\Database\Eloquent\Builder */ public function scopeMostPopular($query, $limit = 10) { return $query->orderBy('sales_count', 'desc')->limit($limit); }
} ```
في هذا المثال، قمنا بتعريف نطاقين محليين: `active` و `mostPopular`.
- `active`: يقوم بإرجاع المنتجات التي تكون قيمة العمود `is_active` فيها مساوية لـ `true`.
- `mostPopular`: يقوم بإرجاع المنتجات مرتبة تنازليًا حسب العمود `sales_count` ويحدد عدد النتائج بحد أقصى بقيمة `$limit`.
لاستخدام هذه النطاقات، يمكنك استدعائها مباشرة على نموذج `Product`:
```php // الحصول على جميع المنتجات النشطة. $activeProducts = Product::active()->get();
// الحصول على أكثر 5 منتجات مبيعًا. $popularProducts = Product::mostPopular(5)->get(); ```
Global Scopes: النطاقات العامة
النطاقات العامة تُطبّق على جميع الاستعلامات التي يتم إجراؤها على نموذج معين، بغض النظر عن مكان استدعائها. هذا مفيد لتطبيق قيود افتراضية على جميع الاستعلامات، مثل إضافة شرط `where` افتراضي أو تطبيق ترتيب افتراضي.
لتحديد نطاق عام، يمكنك استخدام طريقة `addGlobalScope` في نموذج Eloquent:
```php <?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model {
/** * قم بتطبيق نطاق عام لضمان أن جميع المنتجات التي يتم استرجاعها هي نشطة. */ protected static function addGlobalScope($builder) { $builder->where('is_active', true); }
} ```
في هذا المثال، قمنا بتعريف نطاق عام يضيف شرط `where('is_active', true)` إلى جميع الاستعلامات التي يتم إجراؤها على نموذج `Product`. هذا يعني أنه عند استرجاع المنتجات، سيتم استرجاع المنتجات النشطة فقط بشكل افتراضي.
لإلغاء تطبيق نطاق عام مؤقتًا، يمكنك استخدام طريقة `withoutGlobalScopes`:
```php // الحصول على جميع المنتجات، بما في ذلك المنتجات غير النشطة. $allProducts = Product::withoutGlobalScopes()->get(); ```
Custom Scope Bindings: ربط النطاقات المخصصة
تسمح لك ربط النطاقات المخصصة بتمرير قيم ديناميكية إلى النطاقات، مما يجعلها أكثر مرونة وقابلية لإعادة الاستخدام. يمكنك استخدام طريقة `scope` في نموذج Eloquent لتعريف ربط نطاق مخصص.
مثال:
```php <?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model {
/** * نطاق للحصول على المنتجات التي تنتمي إلى فئة معينة. * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $categoryId * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByCategory($query, $categoryId) { return $query->where('category_id', $categoryId); }
} ```
في هذا المثال، قمنا بتعريف نطاق مخصص `byCategory` يأخذ `$categoryId` كمعامل. يقوم هذا النطاق بإرجاع المنتجات التي تنتمي إلى الفئة المحددة.
لاستخدام هذا النطاق، يمكنك استدعائه باستخدام بناء جملة `::scopeByCategory($categoryId)`:
```php // الحصول على جميع المنتجات التي تنتمي إلى الفئة رقم 1. $productsInCategory1 = Product::scopeByCategory(1)->get(); ```
استخدامات متقدمة لـ Laravel Scopes
- **Chaining Scopes (تسلسل النطاقات):** يمكنك تسلسل نطاقات متعددة لتطبيق استعلامات أكثر تعقيدًا.
```php // الحصول على المنتجات النشطة والأكثر مبيعًا. $activePopularProducts = Product::active()->mostPopular(5)->get(); ```
- **Using Scopes with Relationships (استخدام النطاقات مع العلاقات):** يمكنك استخدام النطاقات مع العلاقات للحصول على بيانات مرتبطة بطريقة أكثر فعالية.
```php // الحصول على جميع الفئات التي تحتوي على منتجات نشطة فقط. $categoriesWithActiveProducts = Category::has('products.active')->get(); ```
- **Dynamic Scopes (النطاقات الديناميكية):** يمكنك إنشاء نطاقات ديناميكية بناءً على مدخلات المستخدم أو شروط أخرى.
Laravel Scopes و أداء الاستعلامات
استخدام [Laravel Scopes] يمكن أن يحسن أداء الاستعلامات في تطبيقك. من خلال تجنب تكرار التعليمات البرمجية، يمكنك تقليل حجم الاستعلامات وتقليل وقت التنفيذ. بالإضافة إلى ذلك، يمكن أن تساعدك [Laravel Scopes] في كتابة استعلامات أكثر وضوحًا وقابلية للقراءة، مما يسهل عملية تحسين الأداء.
أفضل الممارسات لاستخدام Laravel Scopes
- **حافظ على بساطة النطاقات:** يجب أن يكون كل نطاق مسؤولاً عن مهمة واحدة محددة.
- **استخدم أسماء وصفية للنطاقات:** يجب أن يعكس اسم النطاق بوضوح الغرض منه.
- **وثّق النطاقات الخاصة بك:** قم بتوثيق الغرض من كل نطاق والمعاملات التي يقبلها.
- **اختبر النطاقات الخاصة بك:** تأكد من أن النطاقات الخاصة بك تعمل بشكل صحيح قبل نشرها في الإنتاج.
الخلاصة
[Laravel Scopes] هي أداة قوية يمكن أن تساعدك في كتابة استعلامات قاعدة البيانات أكثر فعالية وقابلية للصيانة في تطبيقات Laravel الخاصة بك. من خلال فهم الأنواع المختلفة من [Laravel Scopes] وكيفية استخدامها، يمكنك تحسين أداء تطبيقك وتقليل حجم التعليمات البرمجية الخاصة بك.
مواضيع ذات صلة
- Eloquent ORM
- Query Builder
- Database Migrations
- Database Seeding
- Relationships in Laravel
- Laravel Collections
- Laravel Caching
- Laravel Validation
- Laravel Routing
- Laravel Middleware
روابط إضافية (استراتيجيات الخيارات الثنائية وتحليل السوق)
- Binary Options Trading Strategies
- Technical Analysis for Binary Options
- Volume Analysis in Binary Options
- Moving Average Convergence Divergence (MACD)
- Relative Strength Index (RSI)
- Bollinger Bands
- Trend Following Strategies
- Support and Resistance Levels
- Candlestick Patterns
- Risk Management in Binary Options
- Expiry Time Strategies
- High/Low Option Strategy
- Touch/No Touch Option Strategy
- Boundary Option Strategy
- Ladder Option Strategy
- Hedging Strategies
- Scalping Strategies
- Martingale Strategy
- Anti-Martingale Strategy
- Fibonacci Retracement
- Elliott Wave Theory
- Japanese Candlesticks
- Time Frame Analysis
- Market Sentiment Analysis
- News Trading
- Economic Indicators
- Volatility Analysis
ابدأ التداول الآن
سجّل في IQ Option (الحد الأدنى للإيداع 10 دولار) افتح حساباً في Pocket Option (الحد الأدنى للإيداع 5 دولار)
انضم إلى مجتمعنا
اشترك في قناة Telegram الخاصة بنا @strategybin لتصلك: ✓ إشارات تداول يومية ✓ تحليلات استراتيجية حصرية ✓ تنبيهات اتجاهات السوق ✓ مواد تعليمية للمبتدئين