运用Yii修正数据 [ 技术分享 ]
举个例子
地区表数据更新,用户表的字段province_id
和city_id
需要修正(这两字段对应地区表id)
第一步建立中间表map,录入新表旧表id和label的映射
一开始用纯SQL语句进行数据的插入和更新,卡在了新旧表关联更新,至今还不知道是哪里写错了 后来在Yii帮助下完成了录入。
方法如下
新表旧表map表都要创建活动记录AR
用数组助手组成键为id,值为label的数组
$newregion = ArrayHelper::map(Region::find()->select(['id', 'label'])->orderBy('id ASC')->all(), 'id', 'label');
foreach ($newregion as $key => $value){
Yii::$app->db->createCommand()
->insert(
'region_map',
[
'new_id' => $key,
'new_label' => $value,
])
->execute();
}
接下来根据map表的label录入旧表数据
$new_label = RegionMap::find()->select('new_label')->asArray()->all();
$oldregion = [];
foreach ($new_label as $key => $value) {
foreach($value as $val){
$oldregion[] = OldRegion::find()
->select(['id', 'label'])
->where(['like', 'label', "$val"])
->asArray()
->one();
}
}
//过滤数组中的空值
$old_region = array_filter($oldregion);
//遍历,根据new_label和数组钟label的对应关系更新相应的数据
foreach($old_region as $key => $value){
$condition = ['like', 'new_label', "".$value['label'].""];
Yii::$app->db->createCommand()->update('region_map', [
'old_id' => $value['id'],
'old_label' => $value['label']
], $condition)->execute();
}
第二步,用户表join左连map表,select出id,province_id/city_id和map的new_id,遍历结果集数组,实现用户表数据更新
$a = FeUser::find()
->join('LEFT JOIN', 'region_map', 'region_map.old_id = {{%fe_user}}.province_id')
->select(['{{%fe_user}}.id','{{%fe_user}}.province_id','region_map.new_id'])
->asArray()
->all();
foreach ($a as $key => $value) {
if(!empty($value['new_id'])){
$condition = "id = ".$value['id']."";
Yii::$app->db->createCommand()->update('{{%fe_user}}', [
'province_id' => $value['new_id']
], $condition)->execute();
}
}
其实是一些很简单的操作,主要熟悉一下使用DAO,查询生成器Query Builder,ArrayHelper::map(),asArray()方法
共 0 条回复
没有找到数据。
Eddie_c 西非
注册时间:2016-12-05
最后登录:2021-01-05
在线时长:84小时35分
最后登录:2021-01-05
在线时长:84小时35分
- 粉丝14
- 金钱17555
- 威望0
- 积分18395