"هذا المثال سيوضح لك كيفية تجميع البيانات حسب عمود من جدول آخر. على سبيل المثال، سنعرض القيمة الإجمالية المدفوعة لكل مستخدم بالإضافة إلى عدد المنتجات التي طلبوها:"
وللحصول على البيانات كما بالصوره أعلاه
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 خام. الاستعلام يحدد ثلاثة أعمدة:
->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>