/** * 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); }
/** * Insert an array of values into the database table and return the ID. * * @param array $values * @param string $sequence * @return int */ public function insert_get_id($values, $sequence = null) { $sql = $this->grammar->insert($this, $values); $this->connection->query($sql, array_values($values)); // Some database systems (Postgres) require a sequence name to be // given when retrieving the auto-incrementing ID, so we'll pass // the given sequence into the method just in case. return (int) $this->connection->pdo->lastInsertId($sequence); }
/** * Insert an array of values into the database table. * * @param array $values * @return bool */ public function insert($values) { // Force every insert to be treated like a batch insert to make creating // the binding array simpler since we can just spin through the inserted // rows as if there/ was more than one every time. if (!is_array(reset($values))) { $values = array($values); } $bindings = array(); // We need to merge the the insert values into the array of the query // bindings so that they will be bound to the PDO statement when it // is executed by the database connection. foreach ($values as $value) { $bindings = array_merge($bindings, array_values($value)); } $sql = $this->grammar->insert($this, $values); return $this->connection->query($sql, $bindings); }
public function insert(Query $query, $values) { $table = $this->wrap_table($query->from); if (!is_array(reset($values))) { $values = array($values); } if (count($values) == 1) { return parent::insert($query, $values[0]); } $names = $this->columnize(array_keys($values[0])); $columns = array(); 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); }