问题描述
在thinkphp开发过程中,会遇到接口获取的参数名与数据库字段不一致的情况,这时如果想使用tp提供的模型存储方法,就需要一个一个地修改键名,这会使得代码变的臃肿。解决这种问题最简单的方法便是将参数名与数据表中字段名统一,不过这样会暴露数据表真实字段名,导致一些不必要的风险。因此本文针对这个问题提出了以下解决方案。
相关代码
批量修改数组键方法 modifyKeys()
/**
* 数组工具类,实现一些对数组的操作
* Class ArrayUtil
* @package app\util
*/
class ArrayUtil
{
/**
* 根据数组修改数组的键
* @param $arrays array 需要修改的数组
* @param $keys array 目标键值对数组
* @param $level integer 数组维度 当接口获取一条数据时数组维度为1,多条数据时数组维度为2.
* @return array
* @throws Exception 限制数组维度小于等于2维
*/
static public function modifyKeys($arrays, $keys, $level)
{
if ($level > 2){
throw new Exception('错误的维度');
}
if ($level == 1){
$arrays = array($arrays);
}
$newArrays = array();
foreach ($arrays as $i => $arr){
$tempKeys = $keys;
foreach ($arr as $oldKey => $value) {
foreach ($tempKeys as $key => $newKey){
if ($key == $oldKey){
$arr[$newKey] = $value;
unset($arr[$oldKey]);
unset($tempKeys[$key]);
break;
}
}
}
$newArrays[$i] = $arr;
}
return $level == 1 ? $newArrays[0] : $newArrays;
}
}
方法在tp模型中的使用
class User extends Model
{
/**
* @var string[接口字段 => 数据库字段] 接口上传的字段与数据库字段之间的映射
*/
private $fieldMap = [
'nickname' => 'name'
];
/**
* 添加用户
* @param $data array 用户数据
* @return bool|Json
* @throws Exception
* @throws \Exception
*/
public function add($data)
{
$data = ArrayUtil::modifyKeys($data, $this->fieldMap, 2);
$this->saveAll($data);
return true;
}
}