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

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

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


ثبت پرسش جدید
سینا خاقانی
تخصص : توسعه دهنده بک‌اند
@sina.it91 4 سال پیش مطرح شد
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.mahdavi97 4 سال پیش مطرح شد
0

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

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


mq1379
@mahdiqorbani33 4 سال پیش مطرح شد
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.it91 4 سال پیش مطرح شد
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();
}

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

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