راکت
حل شده

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

3 پاسخ

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

ثبت پرسش جدید

پاسخ‌ها

3
سینا خاقانی
سینا خاقانی
@sina.it91

تخصص: توسعه دهنده بک‌اند

بهترین پاسخ

@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.mahdavi97

تخصص: تازه وارد

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

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

mq1379
mq1379
@mahdiqorbani33

الان من اگه بخوام یه کد مثه کد زیر رو به صورت 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,

    ]);

شاید پاسخ شما همین‌جا باشد

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

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