Eddie_c 2017-08-03 16:43:21 2444次浏览 0条回复 0 0 0

举个例子 地区表数据更新,用户表的字段province_idcity_id需要修正(这两字段对应地区表id)

第一步建立中间表map,录入新表旧表id和label的映射 map.png

一开始用纯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()方法

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册