انتقل إلى محتوى الدرس
الدرس 33
دورة إطار العمل Laravel

ربط الجداول والدوال التجميعية في Query BuilderTable Joins and Aggregates in Laravel Query Builder

ربط الجداول المترابطة عبر join و leftJoin وحساب الإحصائيات التجميعية وتجميع الصفوف بـ groupBy و having وفق أحدث معايير إطار العمل Laravel 12 مع أمثلة وتطبيقات عملية متدرجة.
أقسام الدرس
6
الأمثلة
6
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

توزع قواعد البيانات العلائقية البيانات على جداول منفصلة لمنع التكرار، مما يتطلب استخدام جمل الربط JOIN لجمع الحقول المترابطة في استعلام واحد. تنفذ دالة join ربطاً داخلياً يعيد فقط الصفوف التي تتطابق مفاتيحها في كلا الجدولين.

  • صيغة الربط الداخلي (join): تستقبل اسم الجدول الثاني والعمود الأول ومعامل التساوي والعمود المقابل.
  • الأسماء المستعارة (Column Aliases): تمييز الأعمدة المتشابهة كالاسم والمعرف باستخدام كلمة as داخل دالة select.
  • استعلام موحد (Single Query): جلب بيانات الجدولين معاً في رحلة اتصال واحدة سريعة بقاعدة البيانات.
مخطط معماري يوضح ربط الجداول والدوال التجميعية في Query Builder في إطار العمل Laravel 12
PHP
$posts = DB::table('posts')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->select('posts.id', 'users.name as author')
    ->get();

يستبعد الربط الداخلي السجلات الرئيسية التي لا تملك سجلات فرعية، مما قد يخفي العملاء الذين لم يطلبوا بعد أو الأقسام الفارغة. يحافظ استخدام leftJoin على كافة صفوف الجدول الأيسر مع وضع قيمة NULL للحقول الغائبة، وتسمح الدوال المغلقة ببناء شروط ربط مركبة.

  • الربط الأيسر (leftJoin): الاحتفاظ بجميع سجلات الجدول الأساسي حتى لو لم يقابلها أي سجل في الجدول الفرعي.
  • شروط الربط المتقدمة (JoinClause): تمرير دالة مغلقة لدمج عدة شروط on و where داخل جملة الربط نفسها.
  • تصفية آمنة (Scoped Join Filter): وضع الشرط داخل دالة الربط يمنع تحول الربط الأيسر إلى ربط داخلي.
PHP
$users = DB::table('users')
    ->leftJoin('orders', function ($join) {
        $join->on('users.id', '=', 'orders.user_id')
             ->where('orders.status', '=', 'paid');
    })
    ->select('users.name', 'orders.total')
    ->get();

لا تقم أبداً بجلب آلاف الصفوف إلى ذاكرة PHP لمجرد عدها أو جمع أسعارها داخل حلقة تكرارية. تقوم الدوال التجميعية الختامية مثل count و sum و avg و min و max بحساب النتيجة مباشرة داخل محرك قاعدة البيانات وإرجاع رقم واحد فوري.

  • حساب العدد (count): إرجاع العدد الصحيح للصفوف المطابقة للشروط دون نقل بيانات الصفوف.
  • المجموع والمتوسط (sum & avg): حساب المجموع الكلي أو المتوسط الحسابي لعمود رقمي أو مالي.
  • الأدنى والأعلى (min & max): استخراج أصغر أو أكبر قيمة مسجلة في العمود المحدد.
PHP
$paidCount = DB::table('orders')
    ->where('status', 'paid')->count();
$revenue = DB::table('orders')
    ->where('status', 'paid')->sum('total');
$maxOrder = DB::table('orders')->max('total');

عند بناء التقارير الإحصائية مثل إجمالي المبيعات لكل قسم أو عدد الطلبات لكل عميل، استخدم دالة groupBy لتقسيم الصفوف إلى مجموعات. ولأن SQL ينفذ شرط WHERE قبل التجميع، يجب استخدام دالة having لتصفية المجموعات بناءً على قيمتها الإحصائية المحسوبة.

  • تجميع الصفوف (groupBy): دمج السجلات التي تشترك في نفس قيمة العمود داخل مجموعات تلخيصية.
  • تصفية المجموعات (having): تطبيق شروط التصفية على النتائج المجمعة بعد حساب الدوال الإحصائية.
  • الفرق الجوهري: تصفي where الصفوف الفردية قبل التجميع، بينما تصفي having المجاميع النهائية بعد التجميع.
PHP
$vipBuyers = DB::table('orders')
    ->select('user_id')
    ->selectRaw('COUNT(*) as orders_count')
    ->where('status', 'paid')
    ->groupBy('user_id')
    ->having('orders_count', '>=', 5)
    ->get();

تحتاج بعض تقارير الإحصاء المتقدمة إلى كتابة تعبيرات SQL مخصصة مثل دوال العد والعمليات الحسابية داخل جملة الاستعلام. استخدم دائماً دوال selectRaw أو havingRaw مع تمرير المعاملات المتغيرة في مصفوفة الربط الثانية بدلاً من دمج المتغيرات نصياً.

  • تحديد خام آمن (selectRaw): كتابة تعبير SQL مخصص في جملة التحديد مع تمرير المتغيرات في مصفوفة ربط آمنة.
  • تصفية تجميع خام (havingRaw): فحص شروط التجميع الحسابية مع حماية المعاملات عبر علامات الاستفهام.
  • تحذير أمني صارم: لا تدمج مدخلات المستخدم نصياً داخل الدوال الخام أبداً، بل مررها دائماً في مصفوفة المعاملات الثانية.
PHP
$stats = DB::table('products')
    ->select('category_id')
    ->selectRaw('SUM(price * ?) as taxed_sum', [1.15])
    ->groupBy('category_id')
    ->havingRaw('SUM(price) > ?', [1000])
    ->get();

يتيح دمج جمل الربط العلائقية مع الدوال التجميعية وتقسيم المجموعات توليد تقارير إحصائية عالية الأداء مباشرة من قاعدة البيانات. راجع هذا الجدول لاختيار نوع الربط والدالة التجميعية وشرط التصفية المناسب لتقاريرك.

وجه المقارنة الهندسيالأسلوب اليدوي أو غير المحميمعيار Laravel 12 الحديث
جلب البيانات المترابطةتشغيل استعلام منفصل داخل حلقة تكرارية لكل صفاستعلام موحد وسريع عبر join أو leftJoin مع تسمية الأعمدة
حساب الإحصائياتتحميل آلاف الصفوف في ذاكرة الخادم لجمعها برمجياًحساب فوري داخل القاعدة عبر دوال count و sum و avg
تصفية المجموعاتفرز وتصفية المجاميع يدوياً في PHP بعد جلب كافة البياناتتجميع مباشر عبر groupBy وتصفية المجاميع بالدالة having
المعادلات المخصصةدمج المتغيرات بدون حماية داخل نصوص SQL الخامربط آمن للمعاملات عبر selectRaw ومصفوفة القيم
PHP
$report = DB::table('depts')
    ->leftJoin('users', 'depts.id', '=', 'users.did')
    ->select('depts.name')
    ->selectRaw('COUNT(users.id) as staff_count')
    ->groupBy('depts.id', 'depts.name')
    ->get();
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس حول «ربط الجداول والدوال التجميعية في Query Builder» مفاهيم الربط الداخلي للجداول بالدالة join، والربط الأيسر وشروط الربط المركبة، وحساب الإحصائيات عبر الدوال التجميعية وفق معايير Laravel 12 الحديثة.

الخطوة التالية والدرس القادم

انتقل الآن إلى الدرس التالي «تعديل البيانات والمعاملات الذرية وبذر القواعد عبر Seeders» للبناء التراكمي على ما تعلمته.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Builder Joins ربط والتجميع
ربط الجداول المترابطة عبر join و leftJoin وحساب الإحصائيات التجميعية وتجميع الصفوف بـ groupBy و having وفق أحدث معايير إطار العمل Laravel 12 مع أمثلة وتطبيقات عملية متدرجة.
للمراجعة
02 Combining Tables with Inner Joins الربط الداخلي للجداول بالدالة join
المفهوم الهندسي والتطبيق العملي المباشر لقسم الربط الداخلي للجداول بالدالة join في إطار العمل Laravel 12.
للمراجعة
03 Left Joins and Advanced Clauses الربط الأيسر وشروط الربط المركبة
المفهوم الهندسي والتطبيق العملي المباشر لقسم الربط الأيسر وشروط الربط المركبة في إطار العمل Laravel 12.
للمراجعة
04 Calculating Metrics with Aggregates حساب الإحصائيات عبر الدوال التجميعية
المفهوم الهندسي والتطبيق العملي المباشر لقسم حساب الإحصائيات عبر الدوال التجميعية في إطار العمل Laravel 12.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 MVC MVC
Model View Controller
النمط المعماري الذي يفصل بين نماذج البيانات Models، وطبقات العرض Views، والمتحكمات Controllers في Laravel.
للمراجعة
02 CLI CLI
Command Line Interface
واجهة سطر الأوامر التي تعمل عبر أداة php artisan لتوليد الملفات وإدارة التطبيق.
للمراجعة
03 HTTP HTTP
Hypertext Transfer Protocol
بروتوكول نقل النص الفائق الذي ينظم طلبات المتصفح واستجابات خادم Laravel.
للمراجعة
04 PSR PSR
PHP Standards Recommendations
المعايير القياسية للغة PHP مثل التحميل التلقائي PSR-4 التي يلتزم بها إطار العمل Laravel.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. اكتب ونفّذ المثال البرمجي المشروح في قسم «الربط الداخلي للجداول بالدالة join» داخل مشروع Laravel 12 المحلي وتحقق من النتيجة.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم «الربط الأيسر وشروط الربط المركبة» وقارن مخرجات التنفيذ.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

ما الهدف الهندسي الأساسي من الربط الداخلي للجداول بالدالة join في إطار العمل Laravel 12؟

يسهم الربط الداخلي للجداول بالدالة join في تنظيم منطق التطبيق بأسلوب معياري آمن وقابل للصيانة في Laravel 12.

02

يساعد الالتزام باصطلاحات Laravel 12 الرسمية في قسم «الربط الأيسر وشروط الربط المركبة» على رفع جودة الكود وسهولة اختباره آلياً.

صواب؛ الالتزام بالمعايير القياسية في Laravel 12 يجعل الكود واضحاً وسهل الفحص والصيانة.

03

أي آلية في Laravel 12 تتولى إدارة حساب الإحصائيات عبر الدوال التجميعية بشكل مباشر ومنظم؟

توفر طبقة إطار العمل وحاوية الخدمات في Laravel 12 الأدوات القياسية لإدارة حساب الإحصائيات عبر الدوال التجميعية.

04

لماذا يُعد تطبيق تجميع الصفوف وتصفية نتائج التجميع مهماً عند بناء تطبيقات Laravel 12 جاهزة للإنتاج؟

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

05

في Laravel 12، يُنصح بكتابة مفاتيح الإنتاج السرية مباشرة داخل ملفات الكود المصدري المرفوعة إلى Git بدلاً من ملفات البيئة.

خطأ؛ يجب حفظ المفاتيح والبيانات السرية في متغيرات البيئة وعدم رفعها أبداً إلى مستودع Git.

06

ما المزايا الهندسية التي يحققها تطبيق التعبيرات الخام الآمنة عبر selectRaw في Laravel 12؟ (اختر كل ما ينطبق)

يوفر فصلاً واضحاً للمسؤوليات، وأماناً أعلى أثناء التنفيذ، وتعاوناً أسهل بين أفراد الفريق.

07

يوظف إطار العمل Laravel 12 ميزات PHP 8 الحديثة مثل تحديد أنواع القيم المرجعة لجعل الكود أكثر وضوحاً وأماناً.

صواب؛ يعتمد Laravel 12 بشكل كامل على الصياغة الحديثة للغة PHP 8.2+ وسلامة الأنواع.

08

ما الفرق الجوهري بين معيار Laravel 12 الحديث والملفات اليدوية التقليدية في ملخص ربط الجداول والدوال التجميعية؟

يوفر Laravel 12 واجهات قياسية موحدة وحماية مدمجة تغني عن الكود اليدوي المعرض للأخطاء.