2016-11-29 25 views
4

laravelに新しいがあり、ナビゲーションツリーを更新しようとしています。 私はforeachなしで1つのクエリでツリー全体を更新したいと思います。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'))); 

を使用しようとしましたが、私は実行しようとしましたように、それは1つだけの行ではなく、複数のために働きます。 これには別の方法がありますか?

答えて

0

いいえ、できません。複数の行を一度にinsert()とすることができます。同じwhere()を使用して複数の行を作成することもできますが、updateOrCreate()を使用する場合は、foreach()ループを使用する必要があります。

+0

[OK]を使用しても、それを挿入すれば1つだけのクエリを作成できますか? 複数の挿入はforeachで行う必要がありますか? –

+0

@MateuszKudej配列を 'insert()'に渡すと、1つのクエリで複数の行が作成されます。 –

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') 
    ) 
); 

あなたは、単にラインすなわちをコメントアウトし、その後、2番目の引数としてテーブル名を追加することができる機能の最初の行とのトラブルを:安全にお使いのアレイとして挿入または更新することができ

function insertOrUpdate(array $rows, $table){ 
    ..... 
} 

insertOrUpdate(myarrays,'MyTableName'); 

NB:あなたの入力をサニタイズしても注意してください!タイムスタンプフィールドには触れていないことを覚えておいてください。メインアレイの各アレイに手動で追加することで、これを行うことができます。

関連する問題