我想知道为什么这种功能在Laravel核心中还没有可用(直到今天)。请查看此清单。查询字符串的结果将如下所示:此处
为了防止链接在未来失效,我在此处放置代码,作者并非我本人:
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 );
}
因此,您可以安全地将数组插入或更新为:
insertOrUpdate(
array(
array('id'=>1, 'name'=>'some navigation point', 'parent'='0'),
array('id'=>2, 'name'=>'some navigation point', 'parent'='1'),
array('id'=>3, 'name'=>'some navigation point', 'parent'='1')
)
);
如果函数的第一行出现问题,您可以简单地将一个表名作为第二个参数添加到函数中,然后注释掉该行,如下所示:
只要函数第一行有问题时,你可以在第二个参数处添加表名,然后将该行代码注释掉。
function insertOrUpdate(array $rows, $table){
.....
}
insertOrUpdate(myarrays,'MyTableName');
NB: 不过请注意对输入进行净化! 另外请记住时间戳字段不会被更改。您可以通过手动为主数组中的每个数组添加来实现此操作。