/**
* 写入数据
* @access public
* @param array $data 数据数组
* @param array|true $field 允许字段
* @param bool $replace 使用Replace
* @return static
*/
public static function create($data = [], $field = null, $replace = false)
{
$model = new static();
if (!empty($field)) {
$model->allowField($field);
}
$model->isUpdate(false)->replace($replace)->save($data, []);
return $model;
}
静态调用的create update 操作起来确实很方便,但是操作数据库以后怎么判断是否操作成功呢?查看代码并没有返回操作成功与否,在操作完成后会返回这个操作的模型对象。
- 经测试操作失败或者屏蔽 m o d e l − > i s U p d a t e ( f a l s e ) − > r e p l a c e ( model->isUpdate(false)->replace( model−>isUpdate(false)−>replace(replace)->save($data, []); 这一段代码,返回的模型对象是空的,操作成功的话可得到这个模型对象的属性和方法,由此可通过判断返回的模型对象是否为空来判断是否操作成功?事实证明行不通的,仔细阅读代码可知在checkBeforeSave数据已经预加载到了模型中。
- create update 这几个静态方法都未曾返回影响行数,但是我们可以通过获取返回或者影响的记录数来判断是否操作成功呀,上代码
try {
Db::transaction(function ()use ($param) {
//企业
$company = CompanyModel::update(array_slice($param, 0, 5, true));
if (!$company->getNumRows()){
throw new \Exception('更新企业失败了',1003);
}
$compay_app = $company->companyApp()->find();
//应用
$app_data = [
'id' => $compay_app->id,
'app_id'=>$param['app_id'],
'app_secret'=>$param['app_secret'],
'app_name' => substr($param['corpid'], 0,20),
];
$app = AppSettingModel::update($app_data);
if (!$app->getNumRows()){
throw new \Exception('更新企业信息失败了',1003);
}
});
} catch (\Exception $e) {
return json(['code' => 1002, 'msg' => '修改企业失败'.$e->getMessage()]);
}
获取到没有影响行数后,通过手动抛出异常来回滚事务操作