راکت
mq1379
mq1379
توسط mq1379 مطرح شد
حل
3 پاسخ

اجرای هم زمان در کنترلر

سلام من میخوام تو چند جای سایتم یه سری عملیات با هم تو یه کنترلر انجام بشه اما ازونجا که این کارا به ترتیب انجام میشه و همه این کارا حیاتی است اگه اون وسط یه کدوم اررور بده همه چی خراب میشه یعنی یه سری کارا انجام شده یه سری نشده مثلا پول از کیف پول کاربر تو سایت کم شده اما درخواست برداشت به ادمین ارسال نشده یا برعکس شما راهی میدونید که بشه همه کارا رو همزمان انجام داد و اگه هر کدوم اررور داد بقیه انجام نشه؟


ثبت پرسش جدید
سینا خاقانی
سینا خاقانی
تخصص :توسعه دهنده بک‌اند
@sina.it915 سال پیشمطرح شد
0

@mahdiqorbani33
سلام

اینجوری میتونی بنویسی تا هم یه transaction ایجاد کنی و هم بتونی خطاها رو مدیریت کنی

try {
    DB::transaction(function (){
        $arz = Arz::where('symbol', 'USD')->get();

        $wallets = Wallet::where('user_id', $user->id)->get();

        foreach ($arz as $dollar) {

            $karmozd = ($request->BuyPrice * $request->CoinValue) - ($request->GlobalPrice * $request->CoinValue * $dollar->price);

            $karmozd_percent=$karmozd/($request->GlobalPrice * $request->CoinValue * $dollar->price)*100;
        }

        foreach ($wallets as $wallet) {
            if ($wallet->arz_symbol == 'IRR') {

                $wallet->amount = $wallet->amount - ($request->IRRValue);

                $wallet->save();
            }

            if ($wallet->arz_symbol == $request->CoinName) {

                $last_amount = $wallet->amount;
                $wallet->amount = ($last_amount) + ($request->CoinValue);

                $wallet->save();

            }
        }

        $transaction = Transaction::create([
            'user_id' => $user->id,
            'coin_amount' =>$request->CoinValue ,
            'IRR_amount' =>$request->IRRValue ,
            'type'=>'خرید',
            'arz_symbol'=>$request->CoinName,
        ]);

        Buy::create([
            'user_id' => $user->id,
            'arz_symbol' => $request->CoinName,
            'IRR_amount' => $request->IRRValue,
            'coin_amount' => $request->CoinValue,
            'trans_id'=>$transaction->id,
            'karmozd' => $karmozd,
            'karmozd_percent' => $karmozd_percent,

        ]); 
    });
}catch (\ Exception $exception)
{
    return $exception->getMessage();
}

مهدی مهدوی
مهدی مهدوی
تخصص :تازه وارد
@mehdi.mahdavi975 سال پیشمطرح شد
0

سلام
یکی از راه های انجام استفاده از Transactions دیتابیس هست
یعنی شما یک Transactions شروع میکنید و اگر همه ی مراحل آن با موفقیت انجام شد به پایان میرسه و اگر در یکی از مراحل به ارور خورد همه ی عملیات های قبلی rollback میشه

مستندات لاراول : Database Transactions


mq1379
mq1379
@mahdiqorbani335 سال پیشمطرح شد
0

الان من اگه بخوام یه کد مثه کد زیر رو به صورت database transaction بنویسم شما میدونید باید چطور انجامش بدم؟

و اینکه میشه از try catch استفاده کرد یانه؟ اگه استفاده نکنیم چطور باید هنگام خطا پیام مناسب به کابر نمایش بدیم؟

 $arz = Arz::where('symbol', 'USD')->get();

    $wallets = Wallet::where('user_id', $user->id)->get();

    foreach ($arz as $dollar) {

        $karmozd = ($request->BuyPrice * $request->CoinValue) - ($request->GlobalPrice * $request->CoinValue * $dollar->price);

        $karmozd_percent=$karmozd/($request->GlobalPrice * $request->CoinValue * $dollar->price)*100;
    }

    foreach ($wallets as $wallet) {
        if ($wallet->arz_symbol == 'IRR') {

            $wallet->amount = $wallet->amount - ($request->IRRValue);

            $wallet->save();
        }

        if ($wallet->arz_symbol == $request->CoinName) {

            $last_amount = $wallet->amount;
            $wallet->amount = ($last_amount) + ($request->CoinValue);

            $wallet->save();

        }
    }

    $transaction = Transaction::create([
        'user_id' => $user->id,
        'coin_amount' =>$request->CoinValue ,
        'IRR_amount' =>$request->IRRValue ,
        'type'=>'خرید',
        'arz_symbol'=>$request->CoinName,
    ]);

    Buy::create([
        'user_id' => $user->id,
        'arz_symbol' => $request->CoinName,
        'IRR_amount' => $request->IRRValue,
        'coin_amount' => $request->CoinValue,
        'trans_id'=>$transaction->id,
        'karmozd' => $karmozd,
        'karmozd_percent' => $karmozd_percent,

    ]);

سینا خاقانی
سینا خاقانی
تخصص :توسعه دهنده بک‌اند
@sina.it915 سال پیشمطرح شد
0

@mahdiqorbani33
سلام

اینجوری میتونی بنویسی تا هم یه transaction ایجاد کنی و هم بتونی خطاها رو مدیریت کنی

try {
    DB::transaction(function (){
        $arz = Arz::where('symbol', 'USD')->get();

        $wallets = Wallet::where('user_id', $user->id)->get();

        foreach ($arz as $dollar) {

            $karmozd = ($request->BuyPrice * $request->CoinValue) - ($request->GlobalPrice * $request->CoinValue * $dollar->price);

            $karmozd_percent=$karmozd/($request->GlobalPrice * $request->CoinValue * $dollar->price)*100;
        }

        foreach ($wallets as $wallet) {
            if ($wallet->arz_symbol == 'IRR') {

                $wallet->amount = $wallet->amount - ($request->IRRValue);

                $wallet->save();
            }

            if ($wallet->arz_symbol == $request->CoinName) {

                $last_amount = $wallet->amount;
                $wallet->amount = ($last_amount) + ($request->CoinValue);

                $wallet->save();

            }
        }

        $transaction = Transaction::create([
            'user_id' => $user->id,
            'coin_amount' =>$request->CoinValue ,
            'IRR_amount' =>$request->IRRValue ,
            'type'=>'خرید',
            'arz_symbol'=>$request->CoinName,
        ]);

        Buy::create([
            'user_id' => $user->id,
            'arz_symbol' => $request->CoinName,
            'IRR_amount' => $request->IRRValue,
            'coin_amount' => $request->CoinValue,
            'trans_id'=>$transaction->id,
            'karmozd' => $karmozd,
            'karmozd_percent' => $karmozd_percent,

        ]); 
    });
}catch (\ Exception $exception)
{
    return $exception->getMessage();
}

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

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