/** * Compile an insert statement into SQL. * * @param \Database\Query\Builder $query * @param array $values * @return string */ public function doCompileInsert(Builder $query, array $values, $type) { // 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::doCompileInsert($query, reset($values), $type); } $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 "{$type} into {$table} ({$names}) select " . implode(' union select ', $columns); }
/** * Compile the "from" portion of the query. * * @param \Database\Query\Builder $query * @param string $table * @return string */ protected function compileFrom(Builder $query, $table) { $from = parent::compileFrom($query, $table); if (is_string($query->lock)) { return $from . ' ' . $query->lock; } if (!is_null($query->lock)) { return $from . ' with(rowlock,' . ($query->lock ? 'updlock,' : '') . 'holdlock)'; } return $from; }
/** * Compile an update statement into SQL. * * @param \Database\Query\Builder $query * @param array $values * @return string */ public function compileUpdate(Builder $query, $values) { $sql = parent::compileUpdate($query, $values); if (isset($query->orders)) { $sql .= ' ' . $this->compileOrders($query, $query->orders); } if (isset($query->limit)) { $sql .= ' ' . $this->compileLimit($query, $query->limit); } return rtrim($sql); }
/** * Run a truncate statement on the table. * * @return void */ public function truncate() { foreach ($this->grammar->compileTruncate($this) as $sql => $bindings) { $this->connection->query($sql, $bindings); } }