From 53b94468cd3fc7affe19df5f099c0a8f302e986d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Sun, 6 Jan 2013 19:06:50 -0600 Subject: [PATCH] Fix multi inserts in SQLite. --- laravel/database/query/grammars/sqlite.php | 46 ++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/laravel/database/query/grammars/sqlite.php b/laravel/database/query/grammars/sqlite.php index cacc936e..26aabd8f 100644 --- a/laravel/database/query/grammars/sqlite.php +++ b/laravel/database/query/grammars/sqlite.php @@ -21,4 +21,50 @@ protected function orderings(Query $query) 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); + } + } \ No newline at end of file