PHP數據複製

一、前言

  • 假如表中有8條類型爲1數據,我們要再添加8條類型爲2的數據,用sql語句執行也可以,我這裏用PHP代碼實現

二、注意

  • 1、爲了防止方法重複執行導致數據重複增加,我們添加了一個參數allow來控制複製的數據是否可以重複
  • 2、需要添加的數據字段處理
    1)、很明顯id字段是可以去除的(id爲主鍵自增,sql添加數據時會自己計算id的值)
    2)、createTimeupdateTime,也可以去除,因爲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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章