حساب المجموع بإستخدام المجاميع الشرطية Conditional Aggregates في Laravel Eloquent

حساب المجموع بإستخدام المجاميع الشرطية Conditional Aggregates في Laravel Eloquent

2024-05-13 وقت القراءه : 2 دقائق

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

لنفرض أن لدينا جدول المستخدمين، وكل مستخدم له مهمه ويظهر بجانب كل مستخدم حالة المهمة هل هي Completed, Requested, Planned

ونريد أن نعرض إحصائيات لعدد المهمات التي تم طلبها Requested، عدد المهمات المكتملة Completed، عدد المهمات المخطط لها Planned.

واحدة من الحلول عمل تنفيذ جملة إستعلام لكل حالة

$statuses = (object)[];
$statuses->requested=User::where('status','Requested')->count();
$statuses->planned=User::where('status','Planned')->count();
$statuses->completed=User::where('status','Completed')->count();

لكن لو ألقينا نظرة على debug bar نجد أنه:-


تم تنفيذ 5 جمل إستعلام منها 3 فقط للحصول على مجموع كل حالة، في حالتنا هذه ليست مشكله لأنه ليس لدينا إلا ثلاث حالات، لكن ماذا لو لدينا 10 حالات، ما هو الحل؟


للوصول لنتيجة أفضل سأقوم بتنفيذ جمل الإستعلام بداخل برنامج table plus فكل ما نحتاجة هنا هو التعامل مع الدالة count

SELECT
    COUNT(case when status = 'Requested' then 1 end) as Requested,
    COUNT(case when status = 'Planned' then 1 end) as Planned,
    COUNT(case when status = 'Completed' then 1 end) as Completed
FROM
    users

كما نلاحظ تم تنفيذ جملة إستعلام واحدة، لكن تم عمل count لكل حالة.

لكن ما هي then 1 end ، تعني هذه الجملة أنه إذا إحتوى العمود ١ على القيمة ١، إذا CASE ستقوم بإرجاع 1 ثم إضافتها للمجموع، أما إذا لم يحتوي على قيمة فسيتم إرجاع 0.


لتحويل الجملة أعلاه في داخل eloquent يمكن لنا إستخدام to::Base حيث تنشئ collection بالمجاميع ومن ثم التعامل مع كل مجموع.

$statuses = User::toBase()
    ->selectRaw("COUNT(case when status = 'Requested' then 1 end) as requested")
    ->selectRaw("COUNT(case when status = 'Completed' then 1 end) as completed")
    ->selectRaw("COUNT(case when status = 'Pinned' then 1 end) as planned")
    ->first();


لو نظرنا الأن إلى debug bar سنجد إنه تم تنفيذ جملة إستعلام واحدة وليس ٣ كما بالسابق.


إضافة تعليق
Loading...