2016-05-11 51 views
1

JSONファイルをデータベースに挿入するための読み込みスクリプトがあり、このスクリプトはAJAXとローディングインジケータを使用してほぼ50回実行されます。私はこれを使用し、単一のINSERT文のhunderdsを避けるために、これは可能な限り迅速に行わ取得するために、インサートの下の構造を使用するために、ここで、上記の例のようにlaravelでSQLを生成するにはlaravel 5.2複数のAJAXリクエストを使用した複数のAJAXリクエストを使用したバルク挿入toSql()のエラー

INSERT INTO TABLE (COLUMN) VALUES ('value1'),('value2'),('value3') 

実行したいですコード:

foreach ($album_data['data'] as $album) { 
     if (isset($album['name'])) { 
      $array['id'] = $album['id']; 
      $array['name'] = $album['name']; 
      $array['type'] = $album['type']; 
      $arr_albums[] = $array; 
      unset($array); 
     } 
    } 
    DB::table('ALBUM')->insert($arr_albums); 

これは、ほとんどの時間の作品が、このスクリプトは、私が最初に確認しても、同じアルバムが表示され、他のJSON入力のために、一度に数回を解雇されているので、時々エラーが重複キーに関して発生します既に存在するIDです。

This is the proces currently:

  1. get all ID's from the JSON file
  2. use these ID's in a SELECT to check wich are already in the database
  3. create the INSERT statement for those ID's who are not in the database

エラーが(プロセスへの数3)JSONファイルで同じアルバムIDの持つ2つの以上のAJAX要求が同時に(プロセスへの数2)をチェックし、実行している場合に発生するで挿入同時。

私は、生成されたSQLの末尾に「... DUPLICATE KEY UPDATE ON」を追加することで、この問題を解決しようとするので、私はこのようにそれを行うと仮定:

$query = DB::table('ALBUM')->insert($arr_albums)->toSql(); 
$query .= " ON DUPLICATE..."; 

このエラーを引き起こすもの:

Call to a member function toSql() on boolean 

"toSql()"関数は "insert()"では使用できないと思いますか?

答えて

1

私は最も簡単な方法は、テーブルオブジェクトの文法を使用することであると思う:

$table = \DB::table('foo'); 
$sql = $table->getGrammar()->compileInsert($table, $mapping); 
$updateSQL = $table->getGrammar()->compileUpdate($table, $mapping); 
\DB::query($sql . ' ON DUPLICATE KEY ' . substr($updateSQL, strpos($updateSQL, ' set '))); 

/照らしなさい/データベース/クエリ/文法/文法の機能があります。

/** 
* Compile an insert statement into SQL. 
* 
* @param \Illuminate\Database\Query\Builder $query 
* @param array $values 
* @return string 
*/ 
public function compileInsert(Builder $query, array $values) 


/** 
* Compile an update statement into SQL. 
* 
* @param \Illuminate\Database\Query\Builder $query 
* @param array $values 
* @return string 
*/ 
public function compileUpdate(Builder $query, $values) 
関連する問題