一、前言
- 假如表中有8條類型爲1數據,我們要再添加8條類型爲2的數據,用sql語句執行也可以,我這裏用PHP代碼實現
二、注意
- 1、爲了防止方法重複執行導致數據重複增加,我們添加了一個參數
allow
來控制複製的數據是否可以重複
- 2、需要添加的數據字段處理
1)、很明顯id
字段是可以去除的(id爲主鍵自增,sql添加數據時會自己計算id的值)
2)、createTime
,updateTime
,也可以去除,因爲insertAll
方法中拼接上了
3)、當字段類型爲type
時,把type
的值設置爲2
三、思路
- 1、根據參數判斷複製的數據是否可以重複
- 2、如果數據存在,獲取第一條(也可以是任意條)數據的字段名
- 3、循環查出來的數據,循環字段名,根據字段名把查詢的數據處理爲需要添加的數據
- 4、
insertAll()
數據批量添加
四、代碼
1、數據處理
這裏先測試一下核心方法
handleList()
,即把查詢的數據傳進去,返回需要添加的數據
- PHP代碼如下
public function test(){
$list = [
['id' => 1, 'name' => '名稱1', 'desc' => '名稱描述1', 'type' => 1, 'createTime' => 3802834705, 'updateTime' => 3802834705],
['id' => 2, 'name' => '名稱2', 'desc' => '名稱描述2', 'type' => 1, 'createTime' => 3802834705, 'updateTime' => 3802834705],
['id' => 3, 'name' => '名稱3', 'desc' => '名稱描述3', 'type' => 1, 'createTime' => 3802834705, 'updateTime' => 3802834705],
['id' => 4, 'name' => '名稱4', 'desc' => '名稱描述4', 'type' => 1, 'createTime' => 3802834705, 'updateTime' => 3802834705]
];
$toType = 2;
$data = $this->handleList($list, $toType);
var_export($data);
}
/**
* 把查詢出來的數據處理成需要插入的數據
* @param $list 查詢出來的二維數組數據
* @param $toType 需要轉換的類型
* @return array 需要插入的數據
*/
public function handleList($list, $toType){
$data = [];
$keys = array_keys($list[0]); //獲取所有字段名
foreach ($list as $item){
$temp = [];
foreach ($keys as $key){
if ($key == 'type'){ //重置type字段的值
$temp['type'] = $toType;
}else{
$temp[$key] = $item[$key];
}
}
unset($temp['id'], $temp['createTime'], $temp['updateTime']); //刪除不需要的數據
$data[] = $temp;
}
return $data;
}
$data
打印
array (
0 =>
array (
'name' => '名稱1',
'desc' => '名稱描述1',
'type' => 2,
),
1 =>
array (
'name' => '名稱2',
'desc' => '名稱描述2',
'type' => 2,
),
2 =>
array (
'name' => '名稱3',
'desc' => '名稱描述3',
'type' => 2,
),
3 =>
array (
'name' => '名稱4',
'desc' => '名稱描述4',
'type' => 2,
),
)
打印的 $data 結果 符合預期
2、完整代碼
注意:該代碼並不能立即在您的電腦上執行,因爲您
並沒有Db類
,也沒有Db類的insertAll()
方法,我這裏只是給您提供個思路
//入口方法: url /index/test?from=1&to=2&allow=0 (把類型1的數據複製給類型2,並且不允許重複複製)
public function test(){
$param = $_REQUEST;
$fromType = isset($param['from']) ? $param['from'] : 1; //原類型
$toType = isset($param['to']) ? $param['to'] : 2; //需要複製的類型
$allow = isset($param['allow']) ? $param['allow'] : 0; //是否允許重複複製:1允許;0允許,默認否
$this->copyData($fromType, $toType, $allow);
}
/**
* 數據複製
* @param $fromType 待複製的類型
* @param $toType 需要複製的類型
* @param $allow 重複複製:0不允許;1允許。默認0
*/
public function copyData($fromType, $toType, $allow){
$typeDao = new TypeDao();
if (!$allow){ //不允許重複複製
$copyInfo= $typeDao->queryAll(['type' => $toType]);
if ($copyInfo){
die('數據複製過了');
}
}
$list = $typeDao->queryAll(['type' => $fromType]);
if (empty($list)){
die('源數據不存在');
}
//直接調用我們封裝的方法獲取需要插入的數據
$data = $this->handleList($list, $toType);
$res = $typeDao->insertAll($data); //數據插入
if ($res){
die('複製成功');
}
}
/**
* 處理批量插入數據公共方法
* @param $data 待插入的數據
* @return mixed
*/
public function insertAll($data){
$db = new Db(); //數據庫對象
$time = time();
foreach ($data as &$item) {
$item['create_time'] = isset($item['create_time']) ? $item['create_time'] : $time;
$item['update_time'] = isset($item['update_time']) ? $item['update_time'] : $time;
ksort($item); //對關聯數組按照鍵名進行升序排序:爲了防止數據是拼接的,每一條記錄的字段順序不同,這樣可能會導致sql插入的數據(字段)混亂
}
$result = $db->insertAll($data);
return $result;
}