Массовая вставка или обновление 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

второй набор запросов быстрее

Другие вопросы по тегам