"سيبدأ مثالنا العملي الأول بالاستعلام البسيط. سنحصل على المستخدمين النشطين وغير النشطين من قاعدة البيانات. لهذا، سنستخدم حقل 'active' في جدول المستخدمين لدينا، والذي يحتوي على قيم 1 أو 0:"
عادتا ما يلجئ بعض المطورين لإستخدام جملتين ، جمله للحصول على المستخدمين بقيمة active = 1, وجملة أخرى active = 0
$activeUsers = User::where('active', 1)->get(); $inactiveUsers = User::where('active', 0)->get();
لكن بإمكاننا القيام بذلك بإستخدام Group By
$statusCount = User::query() ->addSelect(\DB::raw('count(*) as count')) ->groupBy('active') ->get();
شرح الكود
$statusCount = User::query()
يبدأ هذا السطر استعلام Eloquent، الذي يعد جزءاً من إطار عمل Laravel، على نموذج "User".
->addSelect(\DB::raw('count(*) as count'))
addSelect: تُستخدم هذه الطريقة لإضافة حقول إضافية إلى الاستعلام.
\DB::raw('count(*) as count'): يُستخدم هذا التعبير الخام لحساب العدد الإجمالي للسجلات (المستخدمين) في كل مجموعة. count(*) هي دالة SQL تقوم بحساب عدد الصفوف. as count يُستخدم لإعطاء اسم مستعار لهذه الدالة، والذي يمكن استخدامه لاسترجاع القيمة في البرنامج.
->groupBy('active')
groupBy('active'): يُستخدم لتجميع النتائج بناءً على حقل 'active'. هذا يعني أن الاستعلام سيجمع المستخدمين إلى مجموعتين: مجموعة للمستخدمين الذين لديهم حقل 'active' مساوٍ لـ 1 (النشطين) ومجموعة للذين لديهم القيمة 0 (غير النشطين).
وفي ملف blade
<table class="table table-striped table-bordered"> <thead> <tr> <th>Status</th> <th>Count</th> </tr> </thead> <tbody> <tr> <td>Active</td> <td>{{ $statusCount['1']->count }}</td> </tr> <tr> <td>Inactive</td> <td>{{ $statusCount['0']->count }}</td> </tr> </tbody>
</table>
بالتالي سوف نحصل على البيانات بالشكل التالي
طريقة أخرى للقيام بذلك
public function index() { $statusCount = User::selectRaw(" COUNT(CASE WHEN active = '1' THEN 1 END) AS active_users, COUNT(CASE WHEN active = '0' THEN 1 END) AS inactive_users ") ->toBase() ->first(); return view('groub_by', compact('statusCount')); }
شرح الكود
selectRaw: يستخدم لإدخال استعلام SQL خام. الاستعلام هنا يستخدم دوال SQL لحساب العدد:
COUNT(CASE WHEN active = '1' THEN 1 END) AS active_users: يحسب عدد المستخدمين الذين لديهم العمود active مساوي لـ '1'. هذه طريقة لفلترة البيانات داخل دالة العد.
COUNT(CASE WHEN active = '0' THEN 1 END) AS inactive_users: يعمل بنفس الطريقة لحساب المستخدمين الذين لديهم active مساوي لـ '0'.
وفي ملف blade
<table class="table table-striped table-bordered"> <thead> <tr> <th>Status</th> <th>Count</th> </tr> </thead> <tbody> <tr> <td>Active</td> <td>{{ $statusCount->active_users }}</td> </tr> <tr> <td>Inactive</td> <td>{{ $statusCount->inactive_users }}</td> </tr> </tbody> </table>