Laravel插入或更新多行
问题描述:
即时通讯新的laravel,和即时尝试更新我的导航树。 所以我想更新我的整个树在一个查询没有foreach。Laravel插入或更新多行
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')
);
我只是想问 - laravel中是否存在插入(如果新数组)或更新数据库中当前行的可能性?
我想更新所有,因为我的字段_lft,_right,parent_id在我的树和即时通讯使用一些可拖动的js插件来设置我的导航结构 - 现在我想保存它。
我试图用
Navigation::updateOrCreate(array(array('id' => '3'), array('id'=>'4')), array(array('name' => 'test11'), array('name' => 'test22')));
但它只是为单行,多不喜欢我试图做的。 也许有另一种方法可以做到吗?
答
不,你不能这样做。您可以同时使用insert()
多行,并且您可以使用update()
多行使用相同的where()
条件,但是如果要使用updateOrCreate()
,则需要使用foreach()
循环。
答
在你的控制器中 使用DB; 公共职能arrDta(){
$up_or_create_data=array(
array('id'=>2, 'name'=>'test11'),
array('id'=>4, 'name'=>'test22')
);
var_dump($up_or_create_data);
echo "fjsdhg";
foreach ($up_or_create_data as $key => $value) {
echo "key ".$key;
echo "<br>";
echo " id: ".$up_or_create_data[$key]["id"];
echo "<br>";
echo " Name: ".$up_or_create_data[$key]["name"];
if (Navigation::where('id', '=',$up_or_create_data[$key]["id"])->exists()) {
DB::table('your_table_ name')->where('id',$up_or_create_data[$key]["id"])->update(['name' => $up_or_create_data[$key]["name"]]);
}else{
DB::insert('insert into your_table_name (id, name) values (?, ?)', [$up_or_create_data[$key]["id"], $up_or_create_data[$key]["name"]]);
}
}
答
我不知道为什么这种功能尚未在Laravel核心(至今)可用。退房this gist查询字符串的结果是这样的:here
在这里,我把代码以防万一链路中断在未来,我不是作者:
/**
* 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);
}
所以你可以放心地让您的阵列插入或更新为:
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');
注意:请小心,但要清理您的输入!并记住时间戳字段未被触及。您可以通过手动添加到主数组中的每个数组来完成此操作。
好的,但如果我使用插入它只会使一个查询? 多个插入应该在foreach中完成? –
@MateuszKudej如果你将一个数组传递给'insert()',它将创建多行并带有一个查询。 –