各位大佬,请教个批量保存的问题 [ 2.0 版本 ]
这是 添加的控制器动作方法:
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步,将Purchase
的id
,填充到PurchaseDetail
中每个数据行的order_id
属性中,然后批量保存所有数据行。
第4步,如果批量保存失败,将此次所有保存成功的数据全部删除,再删除第二步添加的Purchase
数据。
哪位大佬帮我思考一下怎样才能更快速,更符合逻辑,然后帮我重写一下Purchase
模型的save
方法?
共 4 个回答
-
应该大概或许是这个思路流程吧!错了也不要怪我!毕竟我也是个渣渣!有大神帮忙指点指点啊
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 条回复
墨轩娣 无锡
注册时间:2015-03-25
最后登录:1小时前
在线时长:274小时58分
最后登录:1小时前
在线时长:274小时58分
- 粉丝38
- 金钱59765
- 威望150
- 积分64005