JavaScript is not enabled!...Please enable javascript in your browser

جافا سكريبت غير ممكن! ... الرجاء تفعيل الجافا سكريبت في متصفحك.

Accueil

كيف أنشأت نظام تصفية وفرز متقدم للبيانات في Laravel باستخدام Query Scopes – بدون مكتبات خارجية

 


✍️ المقدمة:

عندما تبدأ في بناء لوحة تحكم لموقع أو تطبيق باستخدام Laravel، فإن عرض البيانات في الجداول لا يكفي.
المستخدمون (مثل الأدمن أو مشرفي النظام) يحتاجون إلى أدوات تصفية (Filter) وفرز (Sort) قوية وسريعة.

في البداية، كنت أستخدم if وwhere عشوائية داخل Controllers، لكن سرعان ما أصبح الكود صعب الصيانة ومكرر.
ثم اكتشفت ميزة رائعة ومهملة في Laravel: Query Scopes.

في هذا المقال سأشرح كيف أنشأت نظام تصفية وفرز مرن باستخدام Scopes فقط – بدون مكتبات خارجية أو أكواد معقدة.

🎯 أهداف النظام:

  • ✅ تصفية حسب الاسم أو البريد أو الحالة

  • ✅ فرز حسب تاريخ الإنشاء أو الاسم

  • ✅ كود نظيف وقابل لإعادة الاستخدام

  • ✅ يدعم واجهات API أو Blade بسهولة

🧱 نموذج قاعدة البيانات:

نفترض لدينا جدول users يحتوي على:

[الاسم] (البريد) [الحالة] (تاريخ الإنشاء)
[محمد] (mohamed@email.com) [مفعل] (2024-01-01)

⚙️ تعريف Query Scopes في نموذج User:

1. نطاق التصفية حسب الاسم:

public function scopeFilterName($query, $name)
{
    return $name ? $query->where('name', 'like', "%$name%") : $query;
}

2. نطاق التصفية حسب البريد:

public function scopeFilterEmail($query, $email)
{
    return $email ? $query->where('email', 'like', "%$email%") : $query;
}

3. نطاق التصفية حسب الحالة:

public function scopeFilterStatus($query, $status)
{
    return $status ? $query->where('status', $status) : $query;
}

4. نطاق الفرز العام:

public function scopeSortBy($query, $column, $direction = 'asc')
{
    return $column ? $query->orderBy($column, $direction) : $query;
}

🚀 طريقة الاستخدام في الـ Controller:

public function index(Request $request)
{
    $users = User::query()
        ->filterName($request->name)
        ->filterEmail($request->email)
        ->filterStatus($request->status)
        ->sortBy($request->sort_by, $request->direction)
        ->paginate(10);

    return view('admin.users.index', compact('users'));
}

📺 واجهة Blade (أو API):

<form method="GET" action="{{ route('admin.users.index') }}">
    <input name="name" placeholder="الاسم">
    <input name="email" placeholder="البريد">
    <select name="status">
        <option value="">كل الحالات</option>
        <option value="active">مفعل</option>
        <option value="inactive">غير مفعل</option>
    </select>
    <select name="sort_by">
        <option value="name">الاسم</option>
        <option value="created_at">تاريخ الإنشاء</option>
    </select>
    <select name="direction">
        <option value="asc">تصاعدي</option>
        <option value="desc">تنازلي</option>
    </select>
    <button type="submit">تصفية</button>
</form>

✅ الميزات الفعلية لهذا النظام:

(الميزة) (التوضيح)
(بدون أي مكتبة خارجية) (يعمل على أي استضافة)
(قابل للتوسعة بسهولة) (أضف Scopes جديدة لأي عمود)
(ينفع لواجهة Blade أو API) (لأنه معتمد على Laravel Query)
(يحافظ على نظافة الكود) (كل شرط في Scope مخصص وواضح)

⚠️ ملاحظات عملية:

  • استخدم Query Scopes دائمًا بدلًا من if-else داخل Controllers

  • افصل شروط البحث عن طريقة العرض

  • اجعل القيم القادمة من النموذج نظيفة (trim() أو Laravel Request validation)

📈 تحسين إضافي (متقدم):

إذا أردت أن تجعل الكود أكثر أناقة، يمكنك إنشاء Trait اسمه HasAdvancedFilters وتضع فيه كل الـ Scopes.
ثم تستخدمه في أي Model آخر (Products، Orders…).

🧾 الخلاصة:

Laravel يمنحك أدوات قوية لصناعة أدوات فرز وتصفية احترافية بدون أي إضافات خارجية.
ميزة Query Scopes تجعل الكود أنظف، وأكثر مرونة، وأسهل في الاختبار والصيانة.

هذه الطريقة أنقذتني من فوضى الأكواد، وسهلت بناء لوحة تحكم قوية ومرنة.


NomE-mailMessage