2016-11-29 58 views
4

即时通讯新的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'))); 

但它只是为单行,多不喜欢我试图做的。 也许有另一种方法可以做到吗?

回答

0

不,你不能这样做。您可以同时使用insert()多行,并且您可以使用update()多行使用相同的where()条件,但是如果要使用updateOrCreate(),则需要使用foreach()循环。

+0

好的,但如果我使用插入它只会使一个查询? 多个插入应该在foreach中完成? –

+0

@MateuszKudej如果你将一个数组传递给'insert()',它将创建多行并带有一个查询。 –

0

在你的控制器中 使用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"]]); 
     } 

     } 
3

我不知道为什么这种功能尚未在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'); 

注意:请小心,但要清理您的输入!并记住时间戳字段未被触及。您可以通过手动添加到主数组中的每个数组来完成此操作。