Массовая вставка или обновление yii2
Что я сделал
Я вставляю объемные данные в таблицу следующим образом:
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();
}
REF: вставить несколько данных в базу данных в Yii 2
а тут вставка работает нормально.
Что я хочу:
Теперь мой вопрос: можем ли мы сделать что-то вроде того, если здесь columnName1 - закрытый ключ, и если мы передаем нулевое значение для этого столбца, тогда выполняем операцию вставки, в противном случае выполняем операцию обновления.
Та же концепция работает в CAKEPHP.
Я использую YII2.
2 ответа
Я пробовал так много, но в конце завершил его с циклом, как:
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);
}
Дайте мне знать, если есть лучшее решение
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
второй набор запросов быстрее