Mat*_*dej 7 insert rows laravel
我是laravel的新手,我试图更新我的导航树.所以我想在没有foreach的情况下在一个查询中更新我的整个树.
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')
);
Run Code Online (Sandbox Code Playgroud)
我只是想问一下 - 在laravel中是否可以插入(如果是数组中的新)或更新我在数据库中的当前行?
我想更新所有,因为我在我的树中有字段_lft,_right,parent_id,我使用一些可拖动的js插件来设置我的导航结构 - 现在我想保存它.
我试着用
Navigation::updateOrCreate(array(array('id' => '3'), array('id'=>'4')), array(array('name' => 'test11'), array('name' => 'test22')));
Run Code Online (Sandbox Code Playgroud)
但它只适用于单行,而不是像我试图做的那样多行.也许有另一种方法可以做到这一点?
Abd*_*una 11
它现在在Laravel >= 8.x 中可用
该方法的第一个参数包含要插入或更新的值,而第二个参数列出唯一标识关联表中记录的列。该方法的第三个也是最后一个参数是一个列数组,如果数据库中已存在匹配记录,则应更新该列:
Flight::upsert([
['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
], ['departure', 'destination'], ['price']);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么Laravel核心中还没有这种功能(直到今天).看看这个要点查询字符串的结果如下所示:这里
我把这里的代码放在这里以防万一以后链接断开,我不是作者:
/**
* 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 );
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以安全地插入或更新您的阵列:
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')
)
);
Run Code Online (Sandbox Code Playgroud)
为了防止函数中第一行出现任何问题,您可以简单地添加一个表名作为第二个参数,然后注释掉该行,即:
function insertOrUpdate(array $rows, $table){
.....
}
insertOrUpdate(myarrays,'MyTableName');
Run Code Online (Sandbox Code Playgroud)
注意:虽然要小心你的输入,但要小心!并记住没有触及时间戳字段.您可以通过手动添加到主阵列中的每个阵列来实现.
我已经为所有数据库创建了一个 UPSERT 包:https://github.com/staudenmeir/laravel-upsert
DB::table('navigation')->upsert(
[
['id' => 1, 'name' => 'some navigation point', 'parent' => '0'],
['id' => 2, 'name' => 'some navigation point', 'parent' => '1'],
['id' => 3, 'name' => 'some navigation point', 'parent' => '1'],
],
'id'
);
Run Code Online (Sandbox Code Playgroud)
不,你不能这样做。您可以insert()一次处理多行,也可以update()使用相同的条件处理多行where(),但如果您想使用updateOrCreate(),则需要使用foreach()循环。
| 归档时间: |
|
| 查看次数: |
10281 次 |
| 最近记录: |