محمد
6 ماه پیش توسط محمد مطرح شد
2 پاسخ

آپدیت موجودی محصولات بعد هر خرید

سلام دوستان خسته نباشید
من میخوام بعد از خرید هر کاربر محصولات که در سفارش کاربر هستن موجودی شون آپدیت بشه . سرچ کردم راه هایی که می اورد استفاده از for each بود که برای هر محصول یک درخواست آپدیت استفاده میشد بنظرتون راه بهینه تر هم هست که درخواست ها کمتر بشه؟


ثبت پرسش جدید
محمد
@mohammad719 5 ماه پیش مطرح شد
0

@zparto
ممنون از راهنمایی تون 🌹

دوستان راه حل کهchatGPT گفت

use App\Models\Product;
use Illuminate\Support\Facades\DB;

$productsToUpdate = [
    ['id' => 1, 'decrement' => 2],
    ['id' => 2, 'decrement' => 5],
];

// شروع تراکنش برای اطمینان از اجرای اتمی عملیات
DB::transaction(function () use ($productsToUpdate) {
    // تعریف یک آرایه برای نگهداری شرایط CASE برای هر محصول
    $cases = [];

    foreach ($productsToUpdate as $product) {
        $productId = $product['id'];
        $decrement = $product['decrement'];

        // اضافه کردن شرط CASE به آرایه cases
        $cases[] = "WHEN id = $productId THEN stock - $decrement";
    }

    // تبدیل آرایه cases به رشته با استفاده از implode()
    $casesString = implode(' ', $cases);

    // اجرای کوئری به روز رسانی با استفاده از DB::raw() و CASE
    Product::whereIn('id', array_column($productsToUpdate, 'id'))
        ->update([
            'stock' => DB::raw("CASE $casesString ELSE stock END")
        ]);
});

علیرضا پرتویان
تخصص : برنامه نویس پایتون
@zparto 6 ماه پیش مطرح شد
0

این مشکل n+1 هست سرچ کنید یا از چت جی پی تی کمک بگیرید روش های زیادی برای حلش هست


محمد
@mohammad719 5 ماه پیش مطرح شد
0

@zparto
ممنون از راهنمایی تون 🌹

دوستان راه حل کهchatGPT گفت

use App\Models\Product;
use Illuminate\Support\Facades\DB;

$productsToUpdate = [
    ['id' => 1, 'decrement' => 2],
    ['id' => 2, 'decrement' => 5],
];

// شروع تراکنش برای اطمینان از اجرای اتمی عملیات
DB::transaction(function () use ($productsToUpdate) {
    // تعریف یک آرایه برای نگهداری شرایط CASE برای هر محصول
    $cases = [];

    foreach ($productsToUpdate as $product) {
        $productId = $product['id'];
        $decrement = $product['decrement'];

        // اضافه کردن شرط CASE به آرایه cases
        $cases[] = "WHEN id = $productId THEN stock - $decrement";
    }

    // تبدیل آرایه cases به رشته با استفاده از implode()
    $casesString = implode(' ', $cases);

    // اجرای کوئری به روز رسانی با استفاده از DB::raw() و CASE
    Product::whereIn('id', array_column($productsToUpdate, 'id'))
        ->update([
            'stock' => DB::raw("CASE $casesString ELSE stock END")
        ]);
});

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام