Yii2.0中不同业务之间的表导入工作(批量查询, 批量插入)

感想:

我已经做过好几次数据表之间的导入啊,同步啊什么的,数据不是太多,但也不能全部取出,这样速度会很慢的,所以就采用了,批量查询,然后再批量插入操作,现在,我总结下,以备以后进行使用。

1:  //查询数据对象
        $query = $this->swapObj($day, $startTime);

/**
 * 处理牛转用户信息
 *
 * @param string $startTime 开始时间 默认false
 * @return object|null 
 */
public function swapObj($day, $startTime)
{
    $query = WxUser::find()
        ->select('user_mobile, user_fullname, user_email, user_wechat, user_company, created_at, updated_at, user_position, user_country, user_province, user_city, user_area')
        ->where(['>', 'user_swap_register_step', 1]);
    
    //如果day存在,并且为“yesterday”, 说明要统计当前时间的前一天
    if ($day && ($day == 'yesterday')) {
        $timeData = $this->handleTime();

        if (isset($timeData['sTime'], $timeData['eTime']) && $timeData['sTime'] && $timeData['eTime']) {
            $query->andFilterWhere(['between', 'created_at', $timeData['sTime'], $timeData['eTime']]);
        }
    }

    //取出相应条件的数据,并返回
    if ($startTime) {
        $query->andWhere(['>', 'created_at', $startTime]);
    } 

    $query->groupBy("user_mobile")->asArray();
    
    return $query ? $query : null;
}

2: 首先批量查询 100条数据

foreach ($query->batch(100, Yii::$app->crmDb) as $rows) {
    if (!$rows || !is_array($rows)) {
        echo $this->stdout("无数据信息!\n", Console::BOLD);die;
    }

    //遍历每一组数据,进行拆分各个字段,进行组合
    foreach ($rows as $key => $value) {
        //处理需要导出的数据
        $mobile = $value['user_mobile'];
        $wechat = isset($value['user_wechat']) && $value['user_wechat'] ? $value['user_wechat'] : '';
        $fullname = isset($value['user_fullname']) && $value['user_fullname'] ? $value['user_fullname'] : '';
        .........
        $data[] = [$mobile, $wechat, $fullname, $email, $company, $position, $region, $from, $createdAt, $updatedAt, $industry];
        //批量插入操作
        $keys = ['mobile', 'weixin', 'username', 'email', 'company', 'position', 'area', 'come_from', 'created_at', 'updated_at', 'trade'];
        $mUserSummary = new UserSummary();
        $result = $mUserSummary->batchinsertInfo($keys, $data);
        unset($data);
    }
}

说明:

1):  100: 表示批量取出100条数据

2):  Yii::$app->crmDb   数据库地址配置(例如下面是本地配置)

'wxDb' => [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=wx_chuangyejia.com',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'tablePrefix' => 'wx_',
],
3): 得到的rows是你要查询的前100条数据的数组集合

array(100) {
  [0]=>
  array(12) {
    ["user_mobile"]=>
    string(11) "xxxx"
    ["user_fullname"]=>
    string(16) "微信5000好友"
    .....
  }
  [1]=>
  array(12) {
    ["user_mobile"]=>
    string(11) "xxxxx"
    ["user_fullname"]=>
    string(6) "李俊"
    ["user_email"]=>
    ......
  }
  ....
}
4) : $rows遍历后得到的$value, 我们就可以对每组数据中的变量进行处理了
5): 要说的是批量插入

/**
 * 批量插入
 *
 * @param string $keys 要插入的字段属性集合
 * @param array $data 要插入的字段值数组数据
 * @return int|bool
 */
public function batchinsertInfo($keys, $data)
{
    $result = 0;

    if ($keys && $data && is_array($data)) {
        $result = self::find()
            ->createCommand()
            ->batchInsert(self::tableName(),$keys,$data)
            ->execute();
    }

    return $result ? $result : 0;
}
示例如下:
// INSERT 一次插入多行 
$connection->createCommand()
    ->batchInsert('user', 
        ['name', 'age'],    //插入数据的字段名称
        [['Tom', 30],['Jane', 20],['Linda', 25].... ])   //要插入多行的数据
    ->execute();


总结: 以上就是我用到的知识点,其中包括:

1: 如何获取对应的$query对象

2: 批量查询数据

3: 对于批量查询的数据,再进行每条数据分别处理

4: 批量插入操作

5: 其他的就是业务逻辑了

虽然这些看似简单,但也算是知识点吧,对于一个健忘的我,还是有帮助的,加油吧!

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭