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("无数据信息!
", 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: 其他的就是业务逻辑了
虽然这些看似简单,但也算是知识点吧,对于一个健忘的我,还是有帮助的,加油吧!
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: Yii2 使用 RESTful 写API接口 实例
- 下一篇:没有了
