This repository has been archived on 2024-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
lnkohana/modules/database/classes/Kohana/Database/Query/Builder/Insert.php

182 lines
3.7 KiB
PHP
Raw Normal View History

2013-04-22 04:09:50 +00:00
<?php defined('SYSPATH') OR die('No direct script access.');
/**
* Database query builder for INSERT statements. See [Query Builder](/database/query/builder) for usage and examples.
*
* @package Kohana/Database
* @category Query
* @author Kohana Team
* @copyright (c) 2008-2009 Kohana Team
* @license http://kohanaphp.com/license
*/
class Kohana_Database_Query_Builder_Insert extends Database_Query_Builder {
// INSERT INTO ...
protected $_table;
// (...)
protected $_columns = array();
// VALUES (...)
protected $_values = array();
/**
* Set the table and columns for an insert.
*
* @param mixed $table table name or array($table, $alias) or object
* @param array $columns column names
* @return void
*/
public function __construct($table = NULL, array $columns = NULL)
{
if ($table)
{
// Set the inital table name
$this->_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