2016-05-11 2 views
1

Ich habe ein Lade-Skript zum Einfügen von JSON-Dateien in eine Datenbank, dieses Skript wird fast 50 mal mit AJAX und einem Lade-Indikator ausgeführt. Ich mag die unten gezeigte Struktur des Einsatzes verwenden, um diese so schnell wie möglich zu erledigen hunderds einzelne Insert-AnweisungLaravel 5.2 Mysql Bulk-Einfügen mit mehreren AJAX-Anfragen, Fehler auf toSql()

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

ausgeführt zu vermeiden, um hier über die SQL in Laravel wie das Beispiel zu erzeugen, verwende ich diese Code:

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

das meiste Zeit funktioniert, aber manchmal ein Fehler auftritt, in Bezug auf doppelte Schlüssel, da dieses Skript für andere JSON-Eingänge, wo die gleichen Alben erscheinen ein paar Mal auf einmal abgefeuert wird, auch wenn ich zunächst prüfen, bereits vorhandene IDs.

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

Der Fehler tritt auf, wenn zwei oder mehr AJAX-Anfragen mit demselben Album-IDs in den JSON-Dateien werden überprüft (Nummer 2 des Vorarb) zur gleichen Zeit, und laufen (Nummer 3 des Vorarb) Einsatz am gleiche Zeit.

Ich versuche, dieses Problem zu beheben, indem Sie „ON KEY UPDATE DUPLICATE ...“ am Ende der generierten SQL, so nahm ich es, wie dies zu tun:

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

was diesen Fehler verursacht:

Call to a member function toSql() on boolean 

Ich denke, die Funktion "toSql()" ist nicht auf "insert()" möglich?

Antwort

1

Ich denke, der einfachste Weg, um das Tabellenobjekts Grammatik zu verwenden ist:

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

/Illuminate/Datenbank/Query/Grammatiken/Grammatik hat Funktionen:

/** 
* 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)