Example 5. GROUP BY with ORDER BY

Example 5. GROUP BY with ORDER BY

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

"حالة استخدام شائعة أخرى هي تجميع البيانات حسب عمود معين وترتيبها حسب عمود آخر. على سبيل المثال، نريد تجميع طلبات المستخدمين وترتيب هذه الإدخالات حسب عدد الطلبات الإجمالي:"

للحصول على البيانات كما بالصوره أعلاه

public function index()
{
    $orders = Order::selectRaw(
        'users.name as user_name, sum(orders.total) as order_total, sum(order_p.total) as total_products'
    )
        ->join('users', 'orders.user_id', '=', 'users.id')
        ->join(
            DB::raw('(select order_id, count(*) as total
         from `order_product`
         group by order_id) as order_p'),
            'order_p.order_id', '=', 'orders.id',
        )
        ->groupBy('user_name')
        ->orderBy('total_products', 'desc')
        ->get();


    return view('groub_by', compact('orders'));
}

شرح الكود

$orders = Order::selectRaw(
    'users.name as user_name, sum(orders.total) as order_total, sum(order_p.total) as total_products'
)

selectRaw: هذه الدالة تستخدم لكتابة استعلام SQL خام. هنا، يتم تحديد الاستعلام لاسترجاع اسم المستخدم، مجموع إجمالي الطلبات لكل مستخدم، ومجموع عدد المنتجات في كل طلب.

user_name: هو الاسم المستعار لعمود users.name، يستخدم لتمثيل اسم المستخدم.

order_total: يمثل مجموع إجماليات الطلبات.

total_products: يمثل مجموع المنتجات لكل طلب.


->join('users', 'orders.user_id', '=', 'users.id')

join: يربط جدول orders بجدول users حيث يقوم بمطابقة user_id من جدول orders مع id من جدول users.

->join(
    DB::raw('(select order_id, count(*) as total
     from `order_product`
     group by order_id) as order_p'),
    'order_p.order_id', '=', 'orders.id',
)

join with DB::raw: هذا الاستعلام الفرعي يحسب عدد المنتجات في كل طلب من جدول order_product ويجمعها حسب order_id. يتم بعد ذلك الانضمام مع جدول orders باستخدام order_id.

->groupBy('user_name')

groupBy: يجمع البيانات حسب user_name، مما يسمح بتحليل البيانات لكل مستخدم بشكل منفصل.

->orderBy('total_products', 'desc')

orderBy: يرتب النتائج حسب total_products بترتيب تنازلي، مما يعني أن المستخدمين الذين طلبوا أكثر المنتجات سيظهرون أولاً.


 ولعرض البيانات في blade

<table class="table table-striped table-bordered">
    <thead>
    <tr>
        <th>User</th>
        <th>Total</th>
        <th>Total Items</th>
    </tr>
    </thead>
    <tbody>
    @foreach ($orders as $order)
        <tr>
            <td>{{ $order->user_name }}</td>
            <td>${{ number_format($order->order_total / 100, 2) }}</td>
            <td>{{ $order->total_products }}</td>
        </tr>
    @endforeach
    </tbody>
</table>


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