Fix multi inserts in SQLite.
This commit is contained in:
parent
0f690e83a0
commit
53b94468cd
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue