Source of file Update.php
Size: 8,297 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Db/Sql/Update.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Db\Sql; use Zend\Db\Adapter\AdapterInterface; use Zend\Db\Adapter\ParameterContainer; use Zend\Db\Adapter\Platform\PlatformInterface; use Zend\Db\Adapter\Platform\Sql92; use Zend\Db\Adapter\StatementContainerInterface; /** * * @property Where $where */ class Update extends AbstractSql implements SqlInterface, PreparableSqlInterface { /**@#++ * @const */ const SPECIFICATION_UPDATE = 'update'; const SPECIFICATION_WHERE = 'where'; const VALUES_MERGE = 'merge'; const VALUES_SET = 'set'; /**@#-**/ protected $specifications = array( self::SPECIFICATION_UPDATE => 'UPDATE %1$s SET %2$s', self::SPECIFICATION_WHERE => 'WHERE %1$s' ); /** * @var string|TableIdentifier */ protected $table = ''; /** * @var bool */ protected $emptyWhereProtection = true; /** * @var array */ protected $set = array(); /** * @var string|Where */ protected $where = null; /** * Constructor * * @param null|string|TableIdentifier $table */ public function __construct($table = null) { if ($table) { $this->table($table); } $this->where = new Where(); } /** * Specify table for statement * * @param string|TableIdentifier $table * @return Update */ public function table($table) { $this->table = $table; return $this; } /** * Set key/value pairs to update * * @param array $values Associative array of key values * @param string $flag One of the VALUES_* constants * @throws Exception\InvalidArgumentException * @return Update */ public function set(array $values, $flag = self::VALUES_SET) { if ($values == null) { throw new Exception\InvalidArgumentException('set() expects an array of values'); } if ($flag == self::VALUES_SET) { $this->set = array(); } foreach ($values as $k => $v) { if (!is_string($k)) { throw new Exception\InvalidArgumentException('set() expects a string for the value key'); } $this->set[$k] = $v; } return $this; } /** * Create where clause * * @param Where|\Closure|string|array $predicate * @param string $combination One of the OP_* constants from Predicate\PredicateSet * @throws Exception\InvalidArgumentException * @return Select */ public function where($predicate, $combination = Predicate\PredicateSet::OP_AND) { if ($predicate instanceof Where) { $this->where = $predicate; } else { $this->where->addPredicates($predicate, $combination); } return $this; } public function getRawState($key = null) { $rawState = array( 'emptyWhereProtection' => $this->emptyWhereProtection, 'table' => $this->table, 'set' => $this->set, 'where' => $this->where ); return (isset($key) && array_key_exists($key, $rawState)) ? $rawState[$key] : $rawState; } /** * Prepare statement * * @param AdapterInterface $adapter * @param StatementContainerInterface $statementContainer * @return void */ public function prepareStatement(AdapterInterface $adapter, StatementContainerInterface $statementContainer) { $driver = $adapter->getDriver(); $platform = $adapter->getPlatform(); $parameterContainer = $statementContainer->getParameterContainer(); if (!$parameterContainer instanceof ParameterContainer) { $parameterContainer = new ParameterContainer(); $statementContainer->setParameterContainer($parameterContainer); } $table = $this->table; $schema = null; // create quoted table name to use in update processing if ($table instanceof TableIdentifier) { list($table, $schema) = $table->getTableAndSchema(); } $table = $platform->quoteIdentifier($table); if ($schema) { $table = $platform->quoteIdentifier($schema) . $platform->getIdentifierSeparator() . $table; } $set = $this->set; if (is_array($set)) { $setSql = array(); foreach ($set as $column => $value) { if ($value instanceof Expression) { $exprData = $this->processExpression($value, $platform, $driver); $setSql[] = $platform->quoteIdentifier($column) . ' = ' . $exprData->getSql(); $parameterContainer->merge($exprData->getParameterContainer()); } else { $setSql[] = $platform->quoteIdentifier($column) . ' = ' . $driver->formatParameterName($column); $parameterContainer->offsetSet($column, $value); } } $set = implode(', ', $setSql); } $sql = sprintf($this->specifications[static::SPECIFICATION_UPDATE], $table, $set); // process where if ($this->where->count() > 0) { $whereParts = $this->processExpression($this->where, $platform, $driver, 'where'); $parameterContainer->merge($whereParts->getParameterContainer()); $sql .= ' ' . sprintf($this->specifications[static::SPECIFICATION_WHERE], $whereParts->getSql()); } $statementContainer->setSql($sql); } /** * Get SQL string for statement * * @param null|PlatformInterface $adapterPlatform If null, defaults to Sql92 * @return string */ public function getSqlString(PlatformInterface $adapterPlatform = null) { $adapterPlatform = ($adapterPlatform) ?: new Sql92; $table = $this->table; $schema = null; // create quoted table name to use in update processing if ($table instanceof TableIdentifier) { list($table, $schema) = $table->getTableAndSchema(); } $table = $adapterPlatform->quoteIdentifier($table); if ($schema) { $table = $adapterPlatform->quoteIdentifier($schema) . $adapterPlatform->getIdentifierSeparator() . $table; } $set = $this->set; if (is_array($set)) { $setSql = array(); foreach ($set as $column => $value) { if ($value instanceof Expression) { $exprData = $this->processExpression($value, $adapterPlatform); $setSql[] = $adapterPlatform->quoteIdentifier($column) . ' = ' . $exprData->getSql(); } elseif ($value === null) { $setSql[] = $adapterPlatform->quoteIdentifier($column) . ' = NULL'; } else { $setSql[] = $adapterPlatform->quoteIdentifier($column) . ' = ' . $adapterPlatform->quoteValue($value); } } $set = implode(', ', $setSql); } $sql = sprintf($this->specifications[static::SPECIFICATION_UPDATE], $table, $set); if ($this->where->count() > 0) { $whereParts = $this->processExpression($this->where, $adapterPlatform, null, 'where'); $sql .= ' ' . sprintf($this->specifications[static::SPECIFICATION_WHERE], $whereParts->getSql()); } return $sql; } /** * Variable overloading * * Proxies to "where" only * * @param string $name * @return mixed */ public function __get($name) { switch (strtolower($name)) { case 'where': return $this->where; } } /** * __clone * * Resets the where object each time the Update is cloned. * * @return void */ public function __clone() { $this->where = clone $this->where; } } |