Example 3. GROUP BY with Extra Calculations

Example 3. GROUP BY with Extra Calculations

2024-10-18 وقت القراءه : 2 دقائق

-- هذا المثال سيوضح لك كيفية تجميع البيانات بناءً على عمود وتجميع بيانات من جداول متعددة.

-- على سبيل المثال، نريد عرض المخزون الحالي، إجمالي المنتجات المنقولة، والمنتجات المباعة:

للحصول على البيانات كما بالصوره أعلاه، يمكن لنا إستخدام الجملة التالية:

public function index()
{
    $products = Product::query()
        ->select(['name', 'stock_quantity'])
        ->join('order_product', 'products.id', '=', 'order_product.product_id')
        ->addSelect(DB::raw('SUM(order_product.quantity) + products.stock_quantity as total_quantity'))
        ->groupBy('products.id')
        ->get();
    
    return view('groub_by', compact('products'));
}

توضيح

$products = Product::query()

يبدأ هذا السطر استعلام Eloquent للتعامل مع جدول المنتجات. Product::query() يُستخدم لإنشاء كائن استعلام جديد لنموذج Product.

->select(['name', 'stock_quantity'])

هنا من جدول products نحتج لحقلين وهما: name لاسم المنتج و stock_quantity لكمية المخزون.

->join('order_product', 'products.id', '=', 'order_product.product_id')

هنا نحتاج الكمية التي بيعها من كل منتج، والكمية المباعه يتم تخزينها في جدول order_product، لذلك نحتاج عمل join بين جدول products وجدول product. حيث يتم مطابقة id من جدول products مع product_id من جدول order_product. هذا يُستخدم لربط المنتجات بالطلبات التي ظهرت فيها.

->addSelect(DB::raw('SUM(order_product.quantity) + products.stock_quantity as total_quantity'))

هنا نحتاج لإيجاد المجموع ما بين عدد المنتجات كالتالي ( مجموع order_product.quantity لذلك تم إستخدام SUM ) + قيمة stock_quantity من جدول products وتم تعيين الناتج في متغير جديد وهو total_quanity، بذلك يُمكّننا من الحصول على الكمية الإجمالية لكل منتج بما في ذلك ما تم بيعه وما هو متبقي في المخزن.


addSelect(DB::raw(...)) تم استخدامه لإضافة حقل حسابي لا يوجد مسبقًا في جدول البيانات. في هذه الحالة، يُستخدم لحساب total_quantity، وهو مجموع الكميات المطلوبة لكل منتج مُضافًا إليها الكمية المتوفرة في المخزون.

 الدالة DB::raw مفيدة هنا لأنها تسمح بإدراج تعبير SQL خام مباشرة في الاستعلام.

->groupBy('products.id')

يجمع الاستعلام البيانات حسب id المنتجات، مما يضمن أن البيانات المُجمعة لكل منتج تُحسب بشكل منفصل.


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

<table class="table table-striped table-bordered">
    <thead>
        <th>Name</th>
        <th>Stock Qty</th>
        <th>Product Moved</th>
        <th>Product Sold</th>
    </thead>
    <tbody>
    @foreach ($products as $product)
        <tr>
            <td>{{ $product->name }}</td>
            <td>{{ $product->stock_quantity }}</td>
            <td>{{ $product->total_quantity }}</td>
            <td>{{ $product->total_quantity - $product->stock_quantity }}</td>
        </tr>
    @endforeach
    </tbody>
</table>


ما هي addSelect

 يُستخدم الأمر addSelect لإضافة عمود أو عدة أعمدة إلى استعلام SQL دون الحاجة إلى تحديد كافة الأعمدة في الجدول. هذا مفيد بشكل خاص عندما تحتاج إلى تحسين الأداء بتقليل كمية البيانات المسترجعة أو عندما تريد تضمين حسابات أو بيانات مشتقة ضمن الاستعلام.

مثال على كيفية استخدام addSelect في لارافيل:

$users = User::query()
             ->select('name')  // تحديد عمود الاسم فقط
             ->addSelect('email')  // إضافة عمود البريد الإلكتروني إلى الاستعلام
             ->get();

في هذا المثال، يبدأ الاستعلام بتحديد العمود name فقط من جدول المستخدمين، ثم يُضاف عمود email باستخدام addSelect. النتيجة هي استعلام يسترجع فقط أعمدة الاسم والبريد الإلكتروني للمستخدمين، مما يمكن أن يحسن الأداء إذا كان جدول المستخدمين يحتوي على العديد من الأعمدة الأخرى غير الضرورية للعملية الحالية.

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