Skip to content

Commit

Permalink
Fix multi inserts in SQLite.
Browse files Browse the repository at this point in the history
  • Loading branch information
taylorotwell committed Jan 7, 2013
1 parent 0f690e8 commit 53b9446
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions laravel/database/query/grammars/sqlite.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

}

0 comments on commit 53b9446

Please sign in to comment.