牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-09-06 投稿人: 浏览次数:1329

感想:

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

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("无数据信息!
", 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" => "yiidbConnection",
    "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: 其他的就是业务逻辑了

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。