Skip to content

Instantly share code, notes, and snippets.

@RuGa
Last active December 11, 2024 23:14
Show Gist options
  • Select an option

  • Save RuGa/5354e44883c7651fd15c to your computer and use it in GitHub Desktop.

Select an option

Save RuGa/5354e44883c7651fd15c to your computer and use it in GitHub Desktop.
Mass (bulk) insert or update on duplicate for Laravel 4/5
/**
* Mass (bulk) insert or update on duplicate for Laravel 4/5
*
* insertOrUpdate([
* ['id'=>1,'value'=>10],
* ['id'=>2,'value'=>60]
* ]);
*
*
* @param array $rows
*/
function insertOrUpdate(array $rows){
$table = \DB::getTablePrefix().with(new self)->getTable();
$first = reset($rows);
$columns = implode( ',',
array_map( function( $value ) { return "$value"; } , array_keys($first) )
);
$values = implode( ',', array_map( function( $row ) {
return '('.implode( ',',
array_map( function( $value ) { return '"'.str_replace('"', '""', $value).'"'; } , $row )
).')';
} , $rows )
);
$updates = implode( ',',
array_map( function( $value ) { return "$value = VALUES($value)"; } , array_keys($first) )
);
$sql = "INSERT INTO {$table}({$columns}) VALUES {$values} ON DUPLICATE KEY UPDATE {$updates}";
return \DB::statement( $sql );
}
@KieronWiltshire

Copy link
Copy Markdown

It also doesn't protect against SQL injection

@SalientAnimal

Copy link
Copy Markdown

I need help creating something similar for a PHP form. I have tried a few ways but I am not getting it to work. Would appreciate it if anyone here would be willing to help me out.

@ab-kily

ab-kily commented Jul 28, 2019

Copy link
Copy Markdown

It is better to use \DB::connection()->getPdo()->quote($value) instead of str_replace because of the problem when values contain slashes. Just replace the corresponding code with this:

...
        $values = implode( ',', array_map( function( $row ) {
            return '('.implode( ',',
                array_map( function( $value ) { return \DB::connection()->getPdo()->quote($value); } , $row )
            ).')';
        } , $rows )
        );
...

@rassemdev

Copy link
Copy Markdown

where are you guys putting this code! In controller or method!

@francoisauclair911

Copy link
Copy Markdown

@rassemdev it would be in your specific model file. I would make it a trait to be able to reuse it on other models or implement it on Model.php (all models extends this one)

@fernando-ayon

Copy link
Copy Markdown

@rassemdev it would be in your specific model file. I would make it a trait to be able to reuse it on other models or implement it on Model.php (all models extends this one)

Yeah, but the class Model is part of a vendor package. Do not update dependencies that are not your own because they might change in the future. Create a trait and use it in the models that need it, it is quite possible that not all of them will use this functionality.

@icanary

icanary commented Apr 11, 2020

Copy link
Copy Markdown

@rassemdev it would be in your specific model file. I would make it a trait to be able to reuse it on other models or implement it on Model.php (all models extends this one)

you can't create it as a trait to your models, because it can work only with single object. But must work with bunch of them. So in this case trait a good idea for repositories, but not for models.

@sky93

sky93 commented Jan 25, 2021

Copy link
Copy Markdown

This code is totally vulnerable to SQL injection attacks.

@ianrussel

Copy link
Copy Markdown

does this work without composite keys ? I want to mass update but it requires me 7 composite keys to detect duplicate due to extremely poor constructed data from amazon api.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment