Example 1. Get Active/Inactive Users with One Query

Example 1. Get Active/Inactive Users with One Query

2024-09-06 وقت القراءه : 2 دقائق

"سيبدأ مثالنا العملي الأول بالاستعلام البسيط. سنحصل على المستخدمين النشطين وغير النشطين من قاعدة البيانات. لهذا، سنستخدم حقل '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>


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