PHP数据复制

    技术2025-09-29  34

    目录

    一、前言二、注意三、思路四、代码1、数据处理2、完整代码

    一、前言

    假如表中有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; }
    Processed: 0.009, SQL: 9