torrentpier-lts/library/Zend/Db/Sql/Update.php

205 lines
5.4 KiB
PHP
Raw Normal View History

<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
2023-04-01 09:03:34 +03:00
* @copyright Copyright (c) 2005-2015 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\ParameterContainer;
use Zend\Db\Adapter\Platform\PlatformInterface;
2023-04-01 09:03:34 +03:00
use Zend\Db\Adapter\Driver\DriverInterface;
use Zend\Stdlib\PriorityList;
/**
*
* @property Where $where
*/
2023-04-01 09:03:34 +03:00
class Update extends AbstractPreparableSql
{
/**@#++
* @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 PriorityList
*/
protected $set;
/**
* @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();
$this->set = new PriorityList();
$this->set->isLIFO(false);
}
/**
* 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)
{
2023-04-01 09:03:34 +03:00
if ($values === null) {
throw new Exception\InvalidArgumentException('set() expects an array of values');
}
if ($flag == self::VALUES_SET) {
$this->set->clear();
}
$priority = is_numeric($flag) ? $flag : 0;
foreach ($values as $k => $v) {
if (!is_string($k)) {
throw new Exception\InvalidArgumentException('set() expects a string for the value key');
}
$this->set->insert($k, $v, $priority);
}
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
2023-04-01 09:03:34 +03:00
* @return Update
*/
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->toArray(),
'where' => $this->where
);
return (isset($key) && array_key_exists($key, $rawState)) ? $rawState[$key] : $rawState;
}
2023-04-01 09:03:34 +03:00
protected function processUpdate(PlatformInterface $platform, DriverInterface $driver = null, ParameterContainer $parameterContainer = null)
{
$setSql = array();
foreach ($this->set as $column => $value) {
2023-04-01 09:03:34 +03:00
$prefix = $platform->quoteIdentifier($column) . ' = ';
if (is_scalar($value) && $parameterContainer) {
$setSql[] = $prefix . $driver->formatParameterName($column);
$parameterContainer->offsetSet($column, $value);
2023-04-01 09:03:34 +03:00
} else {
$setSql[] = $prefix . $this->resolveColumnValue(
$value,
$platform,
$driver,
$parameterContainer
);
}
}
2023-04-01 09:03:34 +03:00
return sprintf(
$this->specifications[static::SPECIFICATION_UPDATE],
$this->resolveTable($this->table, $platform, $driver, $parameterContainer),
implode(', ', $setSql)
);
}
2023-04-01 09:03:34 +03:00
protected function processWhere(PlatformInterface $platform, DriverInterface $driver = null, ParameterContainer $parameterContainer = null)
{
2023-04-01 09:03:34 +03:00
if ($this->where->count() == 0) {
return;
}
2023-04-01 09:03:34 +03:00
return sprintf(
$this->specifications[static::SPECIFICATION_WHERE],
$this->processExpression($this->where, $platform, $driver, $parameterContainer, 'where')
);
}
/**
* Variable overloading
*
* Proxies to "where" only
*
* @param string $name
* @return mixed
*/
public function __get($name)
{
2023-04-01 09:03:34 +03:00
if (strtolower($name) == '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;
$this->set = clone $this->set;
}
}