/** * Compile an insert statement into SQL. * * @param \Nova\Database\Query\Builder $query * @param array $values * @return string */ public function compileInsert(Builder $query, array $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->wrapTable($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::compileInsert($query, reset($values)); } $names = $this->columnize(array_keys(reset($values))); $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(reset($values)) as $column) { $columns[] = '? as ' . $this->wrap($column); } $columns = array_fill(0, count($values), implode(', ', $columns)); return "insert into {$table} ({$names}) select " . implode(' union select ', $columns); }
/** * Insert a new record into the database. * * @param array $values * @return bool */ public function insert(array $values) { // Since every insert gets treated like a batch insert, we will make sure the // bindings are structured in a way that is convenient for building these // inserts statements by verifying the elements are actually an array. if (!is_array(reset($values))) { $values = array($values); } else { foreach ($values as $key => $value) { ksort($value); $values[$key] = $value; } } // We'll treat every insert like a batch insert so we can easily insert each // of the records into the database consistently. This will make it much // easier on the grammars to just handle one type of record insertion. $bindings = array(); foreach ($values as $record) { foreach ($record as $value) { $bindings[] = $value; } } $sql = $this->grammar->compileInsert($this, $values); // Once we have compiled the insert statement's SQL we can execute it on the // connection and return a result as a boolean success indicator as that // is the same type of result returned by the raw connection instance. $bindings = $this->cleanBindings($bindings); return $this->connection->insert($sql, $bindings); }
/** * Compile an insert statement into SQL. * * @param \Nova\Database\Query\Builder $query * @param array $values * @return string */ public function compileInsert(Builder $query, array $values) { $table = $this->wrapTable($query->from); if (!is_array(reset($values))) { $values = array($values); } if (count($values) == 1) { return parent::compileInsert($query, reset($values)); } $names = $this->columnize(array_keys(reset($values))); $columns = array(); foreach (array_keys(reset($values)) as $column) { $columns[] = '? as ' . $this->wrap($column); } $columns = array_fill(0, count($values), implode(', ', $columns)); return "insert into {$table} ({$names}) select " . implode(' union select ', $columns); }
/** * Insert a new record into the database. * * @param array $values * @return bool */ public function insert(array $values) { if (!is_array(reset($values))) { $values = array($values); } else { foreach ($values as $key => $value) { ksort($value); $values[$key] = $value; } } $bindings = array(); foreach ($values as $record) { foreach ($record as $value) { $bindings[] = $value; } } $sql = $this->grammar->compileInsert($this, $values); $bindings = $this->cleanBindings($bindings); return $this->connection->insert($sql, $bindings); }