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

来源:互联网 发布:淘宝认证考试 编辑:程序博客网 时间:2024/05/01 04:27

感想:

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

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: 其他的就是业务逻辑了

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

0 0
原创粉丝点击