批量插入或更新yii2

时间:2015-04-08 11:14:25

标签: cakephp yii yii2 bulkinsert bulkupdate

我做了什么

我在表中插入批量数据如下:

if(count($bulkInsertArray)>0){
    $columnNameArray=['columnName1','columnName2','columnName3'];
    // below line insert all your record and return number of rows inserted
    $insertCount = Yii::$app->db->createCommand()
                   ->batchInsert(
                         $tableName, $columnNameArray, $bulkInsertArray
                     )
                   ->execute();
}

参考:Insert multiple data into database in Yii 2

这里插入工作正常。

我想要的是什么:

现在我的问题是我们可以执行类似的操作,如果此处columnName1是私钥,并且如果我们为该列传递空值,则执行插入操作,否则执行更新操作

在CAKEPHP中使用相同的概念。

我正在使用YII2。

2 个答案:

答案 0 :(得分:0)

Yii2不提供“upsert”逻辑。
您需要将其拆分为两个操作:
1)插入没有重复(查询下面)
2)更新

--don't insert user if login already exists
insert into users(login, name)
select *
from 
(
    select
    'l_john' as login,
    'John' as name
    union 
    select
    'l_mike' as login,
    'Mike' as name
) q
left join users u
on u.login = q.login
where u.id is null

create temp table tmp_users(login, name);

insert into tmp_users(login, name) values
('l_john', 'John'),
('l_mike', 'Mike');

insert into users(login, name)
select tu.login, tu.name
from tmp_users ti
left join users u
on u.login = tu.login

第二个查询集更快

答案 1 :(得分:0)

我已经尝试了很多,但最后用循环完成了它:

            foreach ($table_info_arr as $table_info)
            {
                $table_info_sql = array();

                $model = tableInfo::find()->where(["columnName1_id" => $table_info['columnName1_id']])->one();
                if (empty($model))
                {
                    $model = new tableInfo();
                }
                $matches_info_sql['tableInfo'] = $table_info;

                $model->load($table_info_sql);
                $model->save(false);
            }

让我知道是否有更好的解决方案