Browse Source

Fix multi inserts in SQLite.

Taylor Otwell 12 years ago
parent
commit
53b94468cd
1 changed files with 46 additions and 0 deletions
  1. 46 0
      laravel/database/query/grammars/sqlite.php

+ 46 - 0
laravel/database/query/grammars/sqlite.php

@@ -21,4 +21,50 @@ class SQLite extends Grammar
 		return 'ORDER BY '.implode(', ', $sql);
 	}
 
+	/**
+	 * Compile a SQL INSERT statement from a Query instance.
+	 *
+	 * This method handles the compilation of single row inserts and batch inserts.
+	 *
+	 * @param  Query   $query
+	 * @param  array   $values
+	 * @return string
+	 */
+	public function insert(Query $query, $values)
+	{
+		// Essentially we will force every insert to be treated as a batch insert which
+		// simply makes creating the SQL easier for us since we can utilize the same
+		// basic routine regardless of an amount of records given to us to insert.
+		$table = $this->wrap_table($query->from);
+
+		if ( ! is_array(reset($values)))
+		{
+			$values = array($values);
+		}
+
+		// If there is only one record being inserted, we will just use the usual query
+		// grammar insert builder because no special syntax is needed for the single
+		// row inserts in SQLite. However, if there are multiples, we'll continue.
+		if (count($values) == 1)
+		{
+			return parent::insert($query, $values[0]);
+		}
+
+		$names = $this->columnize(array_keys($values[0]));
+
+		$columns = array();
+
+		// SQLite requires us to build the multi-row insert as a listing of select with
+		// unions joining them together. So we'll build out this list of columns and
+		// then join them all together with select unions to complete the queries.
+		foreach (array_keys($values[0]) as $column)
+		{
+			$columns[] = '? AS '.$this->wrap($column);
+		}
+
+		$columns = array_fill(9, count($values), implode(', ', $columns));
+
+		return "INSERT INTO $table ($names) SELECT ".implode(' UNION SELECT ', $columns);
+	}
+
 }