请问for怎么判断结束,以及是否需要开事务
public function ensure_verific_code(Request $request) {
$ensure = OrderItem::whereIn('id', $request->list)->update([
'used_at' => date("Y-m-d h:i:s"),
'use_status' => 5
]);
for($i=0;$i<count($request->list);$i++) {
$goods = OrderItem::find($request->list[$i])->merchant_goods;
$order_item = OrderItem::find($request->list[$i]);
Wallet::create([
'user_id' => $request->user()->id,
'order_id' => $order_item->order->id,
'order_item_id' => $request->list[$i],
'reason' => '核销:' . $order_item->trade_no . ':' . $goods->merchant_goods_title,
'original_price' => $order_item->item_unit_price,
'service_percent' => '0.1',
'service_price' => bcmul($order_item->item_unit_price, 0.1, 2),
'real_price' => bcsub($order_item->item_unit_price, bcmul($order_item->item_unit_price, 0.1, 2), 2)
]
);
}
if($ensure) {
return response()->json(["status"=> 'success'])->setStatusCode(201);
} else {
return response()->json(["status"=> 'fail'])->setStatusCode(201);
}
}
我这个需求是要根据核销的单号给用户生成结算流水,因为可能一次核销多个单号,所以用for来产生多条流水记录,有没有更好的方式,因为for不知道怎么判断是否成功了,另外,需要开一个事务吗?会不会有可能流水丢失
改成下面这样呢:
public function ensure_verific_code(Request $request) {
$orderItems = OrderItem::whereIn('id', $request->list)->with('merchant_goods')->get();
$walletData = [];
foreach ($orderItems as $orderItem) {
$goods = $orderItem->merchant_goods;
$walletData[] = [
'user_id' => $request->user()->id,
'order_id' => $orderItem->order->id,
'order_item_id' => $orderItem->id,
'reason' => '核销:' . $orderItem->trade_no . ':' . $goods->merchant_goods_title,
'original_price' => $orderItem->item_unit_price,
'service_percent' => '0.1',
'service_price' => bcmul($orderItem->item_unit_price, 0.1, 2),
'real_price' => bcsub($orderItem->item_unit_price, bcmul($orderItem->item_unit_price, 0.1, 2), 2)
];
}
$updatedCount = OrderItem::whereIn('id', $request->list)->update([
'used_at' => now(),
'use_status' => 5
]);
Wallet::insert($walletData);
$status = $updatedCount ? 'success' : 'fail';
return response()->json(['status' => $status])->setStatusCode(201);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
你这些写法 给我弄不会了
god
单论第二段代码,create 失败就是抛出异常,没有异常就是成功了
1、缺少请求参数验证和过滤。
2、for可以改成php更常用的foreach foreach ($request->list as $OrderItemId)
3、$goods 变量改名为 $goods_record ,表示这是个数据库对象。$order_item 改 $order_item_record
4、find 可以改成 findOrFail
5、最主要的还是逻辑判断问题,既然没有判断条件,那么何来成功or失败?
1、
这样就结束循环了
2、如果sql中增改删,不需要原子性则不需要事务。
比如,
用户注册成功,发送慰问语,这两条sql就不需要事务;因为如果开启了事务,当慰问语发送失败,影响了用户注册。
但是你这种更新订单状态,并且生成流水,这个就必须开启事务;如果状态更新了,没有生成流水,这样流水记录跟订单不匹配了。
这样可好