Example 4. GROUP BY Multiple Tables

Example 4. GROUP BY Multiple Tables

2024-11-22 وقت القراءه : 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')
        ->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، وهي طريقة في Eloquent تسمح بكتابة استعلام SQL خام. الاستعلام يحدد ثلاثة أعمدة:

  • users.name as user_name: اسم المستخدم من جدول users.
  • sum(orders.total) as order_total: مجموع القيم الإجمالية للطلبات من جدول orders.
  • sum(order_p.total) as total_products: مجموع المنتجات لجميع الـ orders الخاصه بـ user معين،  من استعلام فرعي.


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

يربط هذا السطر جدول orders بجدول users باستخدام معرف المستخدم (user_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',
)

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

->groupBy('user_name')

يجمع هذا السطر النتائج حسب user_name، وهذا يعني أنه سيعرض مجموع الطلبات وإجمالي المنتجات لكل مستخدم.


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

<table class="table table-striped table-bordered">
    <thead>
        <th>User</th>
        <th>Total</th>
        <th>Total Items</th>
    </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...