_table = $table; } if ($columns) { // Set the column names $this->_columns = $columns; } // Start the query with no SQL return parent::__construct(Database::INSERT, ''); } /** * Sets the table to insert into. * * @param mixed $table table name or array($table, $alias) or object * @return $this */ public function table($table) { $this->_table = $table; return $this; } /** * Set the columns that will be inserted. * * @param array $columns column names * @return $this */ public function columns(array $columns) { $this->_columns = $columns; return $this; } /** * Adds or overwrites values. Multiple value sets can be added. * * @param array $values values list * @param ... * @return $this */ public function values(array $values) { if ( ! is_array($this->_values)) { throw new Kohana_Exception('INSERT INTO ... SELECT statements cannot be combined with INSERT INTO ... VALUES'); } // Get all of the passed values $values = func_get_args(); $this->_values = array_merge($this->_values, $values); return $this; } /** * Use a sub-query to for the inserted values. * * @param object $query Database_Query of SELECT type * @return $this */ public function select(Database_Query $query) { if ($query->type() !== Database::SELECT) { throw new Kohana_Exception('Only SELECT queries can be combined with INSERT queries'); } $this->_values = $query; return $this; } /** * Compile the SQL query and return it. * * @param mixed $db Database instance or name of instance * @return string */ public function compile($db = NULL) { if ( ! is_object($db)) { // Get the database instance $db = Database::instance($db); } // Start an insertion query $query = 'INSERT INTO '.$db->quote_table($this->_table); // Add the column names $query .= ' ('.implode(', ', array_map(array($db, 'quote_column'), $this->_columns)).') '; if (is_array($this->_values)) { // Callback for quoting values $quote = array($db, 'quote'); $groups = array(); foreach ($this->_values as $group) { foreach ($group as $offset => $value) { if ((is_string($value) AND array_key_exists($value, $this->_parameters)) === FALSE) { // Quote the value, it is not a parameter $group[$offset] = $db->quote($value); } } $groups[] = '('.implode(', ', $group).')'; } // Add the values $query .= 'VALUES '.implode(', ', $groups); } else { // Add the sub-query $query .= (string) $this->_values; } $this->_sql = $query; return parent::compile($db);; } public function reset() { $this->_table = NULL; $this->_columns = $this->_values = array(); $this->_parameters = array(); $this->_sql = NULL; return $this; } } // End Database_Query_Builder_Insert