2018-06-07 10:35:38 2990次浏览 4条回答 0 悬赏 1000 金钱

这是 添加的控制器动作方法:

public function actionCreate()
{
    $model = new Purchase();
    if($model->load(Yii::$app->request->post())){
        if($model->save()){
            return Json::encode(['status' => true]);
        }
    }else{
        $model->loadDefaultValues();  // 加载数据库默认值
        $model->loadDefaultOrderTime();  // 加载订单ID与订单日期
        return $this->render('create', ['model' => $model]);
    }
}

POST接收到的数据是这样的:

D:\wamp64\www\huaizhougangcai\common\models\Purchase.php:88:
array (size=2)
  'Purchase' => 
    array (size=9)
      'supplier_id' => string '8' (length=1)
      'order_id' => string '20180607-0175' (length=13)
      'transport' => string '1' (length=1)
      'freight' => string '0' (length=1)
      'order_time' => string 'Thu Jun 07 2018 10:09:21 GMT+0800' (length=33)
      'payable' => string '0' (length=1)
      'paid' => string '0' (length=1)
      'checkout' => string '1' (length=1)
      'remark' => string '' (length=0)
  'PurchaseDetail' => 
    array (size=2)
      1 => 
        array (size=13)
          'goods_id' => string '44' (length=2)
          'price_method' => string '1' (length=1)
          'number' => string '150' (length=3)
          'unit' => string '2' (length=1)
          'weight' => string '150' (length=3)
          'price' => string '15' (length=2)
          'amount' => string '15' (length=2)
          'weight_meter' => string '15' (length=2)
          'weight_branch' => string '15' (length=2)
          'weight_pieces' => string '15' (length=2)
          'quantity' => string '15' (length=2)
          'status' => string '0' (length=1)
          'remark' => string '' (length=0)
      2 => 
        array (size=13)
          'goods_id' => string '22' (length=2)
          'price_method' => string '1' (length=1)
          'number' => string '15' (length=2)
          'unit' => string '1' (length=1)
          'weight' => string '15' (length=2)
          'price' => string '15' (length=2)
          'amount' => string '15' (length=2)
          'weight_meter' => string '15' (length=2)
          'weight_branch' => string '15' (length=2)
          'weight_pieces' => string '15' (length=2)
          'quantity' => string '15' (length=2)
          'status' => string '0' (length=1)
          'remark' => string '' (length=0)

现在我想通过重写Purchase模型的save方法,来实现批量保存PurchaseDetail模型的数据:
第1步. 先接收PurchaseDetail的值,并验证数据有效性。全部有效执行下一步。
第2步,保存Purchase模型数据,得到id。保存成功执行下一步。
第3步,将Purchaseid,填充到PurchaseDetail中每个数据行的order_id属性中,然后批量保存所有数据行。
第4步,如果批量保存失败,将此次所有保存成功的数据全部删除,再删除第二步添加的Purchase数据。

哪位大佬帮我思考一下怎样才能更快速,更符合逻辑,然后帮我重写一下Purchase模型的save方法?

  • 回答于 2018-06-07 10:37 举报

    事务处理哈

    1 条回复
    回复于 2018-06-07 11:02 回复

    不懂事务,有示例代码吗

  • 回答于 2018-06-07 10:46 举报

    一楼正解,用事务

  • 回答于 2018-06-07 11:35 举报

    应该大概或许是这个思路流程吧!错了也不要怪我!毕竟我也是个渣渣!有大神帮忙指点指点啊

    public function actionCreate()
    {
        $model = new Purchase();
        if($model->load(Yii::$app->request->post())){
            Yii::$app->getResponse()->format = 'json';
            $result = $this->Renew($model, Yii::$app->request->post());
        }else{
            $model->loadDefaultValues();  // 加载数据库默认值
            $model->loadDefaultOrderTime();  // 加载订单ID与订单日期
            return $this->render('create', ['model' => $model]);
        }
    }
    
    public function Renew($model, $post)
    {
         /** 开启事务 */
        $trans = Yii::$app->db->beginTransaction();
        try
        { 
            $results = $this->saveRenew($post);
            if($results['code'] == 400){
                 $trans ->rollBack(); //回滚事务(不知道这样可不可以删除全部的哈哈哈)
                throw new Exception($model->getErrors());
            }
            $trans->commit();  //提交事务
            return true;
        }catch (Exception $ex) {
            $trans ->rollBack(); //回滚事务
            return false;
        }
    }
    
    public function saveRenew($post)
    {
        $goods_id = ArrayHelper::getValue($post, 'PurchaseDetail.goods_id');       //
        //所有列的数据!PurchaseDetail是多个数组,要foreach循环去拿吧
    
        //先保存Purchase,如果保存成功拿出id,然后再循环组装下面的数组
    
        $values[] = [
            'goods_id' => $goods_id,
            //所有要保存的字段
        ];
    
        /** 最后添加$values数组到表里 batchInsert是批量保存 */
        $num = Yii::$app->db->createCommand()->batchInsert(/**需要保存到的表*/::tableName(), [
            'goods_id',//所有需要保存的字段
        ],$values)->execute();
    
        if($num > 0){
            return ['code' => 200];
        } else {
            return ['code' => 400];
        }
    }
    
    1 条回复
    回复于 2018-06-09 08:45 回复

    其实这种批量的有多种方式处理,事务可以是一种,队列也是一种,队列消息我觉的更灵活,比如批量100条记录,每循环一次处理数据,当处理到一条数据有异常时,添加标记与状态继续下一个循环,说的简单点就是短信群发,任务。

  • 回答于 2018-06-07 14:30 举报

    batchInsert

您需要登录后才可以回答。登录 | 立即注册
墨轩娣
董事长

墨轩娣 无锡

注册时间:2015-03-25
最后登录:1小时前
在线时长:274小时58分
  • 粉丝38
  • 金钱59765
  • 威望150
  • 积分64005

热门问题