/** * 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); }
/** * Execute the query as a DELETE statement. * * Optionally, an ID may be passed to the method do delete a specific row. * * @param int $id * @return int */ public function delete($id = null) { // If an ID is given to the method, we'll set the where clause to // match on the value of the ID. This allows the developer to // quickly delete a row by its primary key value. if (!is_null($id)) { $this->where('id', '=', $id); } $sql = $this->grammar->delete($this); return $this->connection->query($sql, $this->bindings); }
/** * Compile a SQL SELECT statement from a Query instance. * * @param Query $query * @return string */ public function select(Query $query) { $sql = parent::components($query); // SQL Server does not currently implement an "OFFSET" type keyword, so we // actually have to generate the ANSI standard SQL for doing offset like // functionality. OFFSET is in SQL Server 2012, however. if ($query->offset > 0) { return $this->ansi_offset($query, $sql); } // Once all of the clauses have been compiled, we can join them all as // one statement. Any segments that are null or an empty string will // be removed from the array before imploding. return $this->concatenate($sql); }
public function select(Query $query) { $sql = parent::components($query); if ($query->offset > 0) { return $this->ansi_offset($query, $sql); } return $this->concatenate($sql); }