مقارنة بين Scopes + Traits × UseEloquentBuilder في Laravel

يوليو 13, 2025

في Laravel، بنحتاج دايمًا نكتب استعلامات شبه بعض في أكتر من مكان. Laravel بتوفر طريقتين أساسيين نقدر نستخدمهم علشان نرتّب الاستعلامات دي: Scopes + Traits، أو Custom Builder باستخدام #[UseEloquentBuilder].

🔹 أولًا: استخدام Scopes مع Traits

الـ Scope هو مجرد دالة في الموديل بتبدأ بكلمة scope، وبتساعدك تعيد استخدام شروط الاستعلام. أما Trait فهي مكان بتجمع فيه أكتر من Scope علشان تقدر تستخدمهم في موديلات مختلفة بسهولة.

مثال عملي على Trait فيها Scopes:

// app/Traits/ArticleScopes.php
namespace App\Traits;

trait ArticleScopes {
    public function scopePublished($query) {
        return $query->where('is_published', true);
    }

    public function scopeRecent($query, $days = 7) {
        return $query->whereDate('created_at', '>=', now()->subDays($days));
    }

    public function scopeByAuthor($query, $authorId) {
        return $query->where('author_id', $authorId);
    }
}

واستخدامها في الموديل:

// app/Models/Article.php
use App\Traits\ArticleScopes;

class Article extends Model {
    use ArticleScopes;
}

واستخدامها في الكود:

$articles = Article::published()->recent(30)->byAuthor(5)->paginate(10);

✅ مميزات الطريقة دي:

  • سهلة وسريعة في المشاريع الصغيرة والمتوسطة.
  • تقدر تعيد استخدامها في موديلات تانية بسهولة.
  • مش محتاج تكتب كود كتير.

❌ العيوب:

  • الاستعلامات ممكن تنتشر في كذا Trait، وده يخلي تتبعها أصعب.
  • الـ IDE مش دايمًا بيديك مساعدة قوية (Autocomplete ضعيف).
  • صعب تختبر كل Scope لوحده بسهولة.

🔹 ثانيًا: استخدام #[UseEloquentBuilder] في Laravel 12.19

الميزة دي بتخليك تعرف Builder class خاص بالموديل، وده بيخلي كل منطق الاستعلام يتجمع في مكان واحد. Laravel بقت تدعم ده رسميًا عن طريق Attribute اسمه #[UseEloquentBuilder].

مثال عملي:

// app/Builders/ArticleBuilder.php
namespace App\Builders;

use Illuminate\Database\Eloquent\Builder;

class ArticleBuilder extends Builder {
    public function published(): static {
        return $this->where('is_published', true);
    }

    public function recent(int $days = 7): static {
        return $this->whereDate('created_at', '>=', now()->subDays($days));
    }

    public function byAuthor(int $authorId): static {
        return $this->where('author_id', $authorId);
    }
}
// app/Models/Article.php
namespace App\Models;

use App\Builders\ArticleBuilder;
use Illuminate\Database\Eloquent\Attributes\UseEloquentBuilder;

#[UseEloquentBuilder(ArticleBuilder::class)]
class Article extends Model {
    // مش محتاج تعمل override لـ newEloquentBuilder
}
// الاستخدام:
$articles = Article::query()->published()->recent(15)->byAuthor(2)->get();

✅ مميزات Custom Builder:

  • كل الاستعلامات متجمعة في Class واحد – سهل التتبع والتنظيم.
  • Autocomplete ممتاز في IDE.
  • سهل تكتب عليه اختبارات (unit tests).
  • الأسامي مش مرتبطة بـ scope – تقدر تسمي بحرية.

❌ العيوب:

  • محتاج تكتب كود أكتر.
  • ممكن يكون Overkill في مشاريع صغيرة.

📊 مقارنة سريعة:

الميزة Scopes + Traits #[UseEloquentBuilder]
سهولة البدء ✅ سهلة جدًا 🔸 تحتاج تعريف Builder
تنظيم الكود 🔸 متوسط ✅ عالي جدًا
الدعم في IDE 🔸 محدود ✅ قوي
الاختبارات 🔸 أصعب شوية ✅ أسهل في العزل
مناسب للمشاريع الكبيرة 🔸 قابل للتشابك ✅ الأنسب

🧠 الخلاصة:

لو مشروعك بسيط، وبتحتاج شرطين أو تلاتة بيتكرروا – Scopes + Traits هتنجز وتكفيك. لكن لو بتشتغل على مشروع كبير، وفيه استعلامات معقدة أو متكررة كتير – الـ Custom Builder باستخدام #[UseEloquentBuilder] هيكون أنسب بكتير من حيث التنظيم والمرونة والتوسّع.

المدونة

دورة حياة الطلب في Laravel (Request Lifecycle)

مايو 23, 2026

رحلة الـ Request داخل Laravel: الفكرة الأساسية ودورة الحياة الكاملة فهم عميق لكيفية معالجة إطار العمل لارافل للطلبات من البداية وحتى النهاية لإ...

Laravel 12.21.0 – تحديث ذكي لتسهيل الاستعلامات والتحقق الصارم للبيانات

أغسطس 03, 2025

أصدرت Laravel النسخة 12.21.0 بمزايا برمجية هامة تساهم في كتابة كود أنظف وأسهل في الصيانة. من أهمها دالة whereValueBetween() الجديدة، بالإضافة إلى...

الفرق بين Redux, Context & React Components في إدارة الحالة

أغسطس 06, 2025

عند بناء تطبيقات باستخدام React، هناك حاجة إلى إدارة البيانات التي تتغير نتيجة تفاعل المستخدم أو جلب البيانات من مصادر خارجية. توجد ثلاث وسائل رئيسي...

استخدام useCallback في React: الفوائد، القيود، والممارسات المثالية

يوليو 31, 2025

Hook useCallback في React يُستخدم لإنشاء نسخة ثابتة من دالة (callback) بحيث لا يُعاد إنشاؤها إلا إذا تغيرت الـ dependencies المحددة. الهدف الأساسي م...

لارافيل 12.16.0 - مميزات جديدة للمطورين

يونيو 03, 2025

لارافيل 12.16.0 - مميزات جديدة للمطورين 1. قاعدات تحقق جديدة: in_array_keys دلوقتي تقدر تتحقق إن الأراي فيه على الأقل مفتاح واحد من اللي انت محددهم...

الدليل الكامل لتحديثات ECMAScript 2025 للمطورين

يوليو 06, 2025

📘 شرح تفصيلي لتحديثات ECMAScript 2025 جميع مميزات ECMAScript 2025، مع أمثلة عملية وفهم ليه الميزة دي مهمة لأي مبرمج واجهة أمامية. ١. مجموعات مسما...