请问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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 7

你这些写法 给我弄不会了

1年前 评论

单论第二段代码,create 失败就是抛出异常,没有异常就是成功了

1年前 评论

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年前 评论

1、

for() {
 if () {
  break;
 }
}

这样就结束循环了

2、如果sql中增改删,不需要原子性则不需要事务。

比如,

用户注册成功,发送慰问语,这两条sql就不需要事务;因为如果开启了事务,当慰问语发送失败,影响了用户注册。

但是你这种更新订单状态,并且生成流水,这个就必须开启事务;如果状态更新了,没有生成流水,这样流水记录跟订单不匹配了。

1年前 评论
    $id_array = []; //传的id
    //前置判断,判断数组是不是为空, 为空return fail;    不为空 for循环完 直接 return success;
    for ($i = 0, $iMax = count($id_array); $i < $iMax; $i++) {
        //推送到队列
        Queue::dispatch('test');
    }

    //队列
    try {
        $orderInfo = Order::find($this->id);

    } catch (\Exception $e) {

    }
    if ((int)$orderInfo->status !== 5) {
    //开始处理,写核销记录,并且修改状态
    }
1年前 评论
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);
}

这样可好

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!