سلام من میخوام تو چند جای سایتم یه سری عملیات با هم تو یه کنترلر انجام بشه اما ازونجا که این کارا به ترتیب انجام میشه و همه این کارا حیاتی است اگه اون وسط یه کدوم اررور بده همه چی خراب میشه یعنی یه سری کارا انجام شده یه سری نشده مثلا پول از کیف پول کاربر تو سایت کم شده اما درخواست برداشت به ادمین ارسال نشده یا برعکس شما راهی میدونید که بشه همه کارا رو همزمان انجام داد و اگه هر کدوم اررور داد بقیه انجام نشه؟
@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();
}
سلام
یکی از راه های انجام استفاده از Transactions دیتابیس هست
یعنی شما یک Transactions شروع میکنید و اگر همه ی مراحل آن با موفقیت انجام شد به پایان میرسه و اگر در یکی از مراحل به ارور خورد همه ی عملیات های قبلی rollback میشه
مستندات لاراول : Database Transactions
الان من اگه بخوام یه کد مثه کد زیر رو به صورت 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,
]);
@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();
}
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟