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

原创 2016年09月06日 11:08:25

感想:

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

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

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

相关文章推荐

Yii2批量插入数据

方法一 yii2一次插入多行数据  /** * @inheritdoc 批量添加 * @params $add array 添加数据 */ public...

yii2批量插入数据与查询大量数据使用batch和each省内存

$userkey=['login','password','nicename','email','create_time'];//测试数据键 $uservale=array( ...

yii2批量插入数据

yii的ar类批量插入数据好像有点问题,或者是我没找到方法。这里先记录另一种yii批量插入数据的方法,以后找到ar类批量插入方法在记录下。 $arr =[]; ...

YII2-数据查询Active Record方法

查询数据 AR 提供了两种方法来构建 DB 查询并向 AR 实例里填充数据: •[[yii\db\ActiveRecord::find()]] •[[yii\db\ActiveRecord::f...
  • xmlife
  • xmlife
  • 2015年06月12日 14:52
  • 6798

yii2一次插入多行数据

yii2框架 一次插入多条数据

Yii2 购物车 批量插入,更新数据

Yii2批量插入,更新数据在使用yii2开发项目时,有时候会遇到这样的情况: 向后台发送多条数据,其中一些数据已经存在记录,只需要对其部分字段的值进行修改;而另一部分的数据则需要新添加进去.比如我们在...

yii框架如何引入css、img、js文件

首先:在这里顺便在这里给大家介绍一下怎么使用yii框架。 我们可到yii框架官方网站下载yii框架的程序包,下载之后,我们就只需要framework该文件目录,在我们的根目录下面创建属于自己的项目名...

PHP之分布式缓存memcached熟悉和操作

如今互联网崛起的时代,各大网站都面临着一个大数据流问题,怎么提高网站访问速度,减少对数据库的操作;作为PHP开发人员,我们一般能想到的方法有页面静态化处理、防盗链、CDN内容分发加速访问、mysql数...

ios delegate代理,多个/不同/两个view之间传递数据,传递批量数据,多个数据

要在view之间传数据大家都知道用delegate,我这里谈一下心得,适合新手。

Yii: 批量插入数据的扩展类简单实现

MySQL INSERT语句允许插入多行数据,如下所示:INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);那么要实现批量插入,主要的...
  • iefreer
  • iefreer
  • 2014年02月25日 01:48
  • 7369
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Yii2.0中不同业务之间的表导入工作(批量查询, 批量插入)
举报原因:
原因补充:

(最多只允许输入30个字)