Laravel 12.19: استخدام Attributes لتنظيم الـ Query Builder

يوليو 7, 2025

Laravel 12.19: استخدام Attributes تنظّم Query Builder

في Laravel 12.19، دلوقتي تقدر تستخدم Attribute اسمه #[UseEloquentBuilder] علشان تحدد Query Builder خاص بالموديل، من غير ما تبقى محتاج تعمل override للـ newEloquentBuilder() — ده بيخلي الكود أوضح وأسهل في الصيانة.

ليه تستخدم "Query Builder" خاص؟

  • خلي الموديلات مركزة — ركّز على العلاقات، مش على استعلامات معقدة.
  • جمّع المنطق القابل لإعادة الاستخدام زي wherePublished() في مكان واحد.
  • ارتّب الكود أكتر وتجميع الاستعلامات يخليه أوضح.

الطريقة القديمة

// app/Models/Article.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Builders\ArticleBuilder;

class Article extends Model {
  public function newEloquentBuilder($query) {
    return new ArticleBuilder($query);
  }
}

الطريقة الجديدة

// app/Models/Article.php
namespace App\Models;

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

#[UseEloquentBuilder(ArticleBuilder::class)]
class Article extends Model {
  // مش محتاجين Override
}

مثال على Builder

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

use Illuminate\Database\Eloquent\Builder;

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

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

  public function byCategory(string $slug): static {
    return $this->whereHas('category', fn($q) => $q->where('slug', $slug));
  }
}

إزاي تستخدمه

$articles = Article::query()
  ->whereActive()
  ->recent(14)
  ->byCategory('tech')
  ->orderByDesc('published_at')
  ->paginate(10);

نصائح احترافية

  1. ✅ استخدمه بس لما الكود بتاعك تتكرر فيه الاستعلامات.
  2. ⚙️ خلي الأسامي مرنة، زي recent(int $days).
  3. 🧪 اكتب tests لكل دالة في الـ Builder.
  4. 📘 ممكن تخلطها مع Global Scopes لو حابب تنظف الكود أكتر.

الميزة دي جات ضمن إصدار Laravel 12.19 اللي كمان ضمّت: نوع Casting جديد AsFluent، Middleware للـ Job اسمه FailOnException، ودوال assertions جديدة للـ redirect back.

المدونة

كيف تجعل موقعك "سريع جداً" خطوة بخطوة

يوليو 30, 2025

لماذا السرعة ليست رفاهية؟ في زمن الضغط والسرعة، ما فيش حد عنده وقت يستنى موقع يحمّل! المستخدمين على الموبايل بينسحبوا من الموقع إذا ما فتحش في أق...

حقق أداءً أعلى لتقارير البيانات الضخمة باستخدام نظام (Queues)

يوليو 07, 2025

إزاي نعمل كاش لتقارير بفترة زمنية ثابتة إزاي نولّد تقارير ضخمة في الخلفية باستخدام الـ Job Queues 1. 🧠 كاش للتقارير بفترة زمنية ثابتة لو ع...

إزاي OAuth بيشتغل

يونيو 29, 2025

إزاي OAuth بيشتغل؟ OAuth هو بروتوكول بيخلّي التطبيقات تقدر تدخل على بياناتك بطريقة آمنة من غير ما تدّيهم الباسورد بتاعك. زي مثلًا لو حبيت تطبيق ينشر...

تحديث Laravel 12.18.0

يونيو 17, 2025

تحديث Laravel 12.18.0 صدر نسخه Laravel 12.18.0 فيها شوية ميزات جامدة كده: توابع لتشفير وفك تشفير النصوص باستخدام Stringable ديركت في chain strings...

البرمجة الكائنية (OOP) – المفاهيم الأساسية

أغسطس 09, 2025

البرمجة الكائنية التوجه (Object Oriented Programming - OOP) هي أسلوب حديث في تطوير البرمجيات يُقسّم التطبيق إلى وحدات تسمى كائنات (Objects) تتفاعل م...

نظرة معمقة على Laravel Context: تسجيل وتحليل السياق البرمجي باحترافية

يوليو 20, 2025

في Laravel 12، تم تقديم Laravel Context كأداة قوية بتخلي تتبع الطلبات، تسجيل الأخطاء، وتحليل سلوك الوظائف الخلفية أسهل وأدق من أي وقت فات. وده بيحصل ع...