class UpdateQuery

General class for an abstracted UPDATE operation.

Hierarchy

Expanded class hierarchy of UpdateQuery

Related topics

1 string reference to 'UpdateQuery'
DatabaseConnection::update in includes/database/database.inc
Prepares and returns an UPDATE query object.

File

includes/database/query.inc, line 969

View source
class UpdateQuery extends Query implements QueryConditionInterface {
    
    /**
     * The table to update.
     *
     * @var string
     */
    protected $table;
    
    /**
     * An array of fields that will be updated.
     *
     * @var array
     */
    protected $fields = array();
    
    /**
     * An array of values to update to.
     *
     * @var array
     */
    protected $arguments = array();
    
    /**
     * The condition object for this query.
     *
     * Condition handling is handled via composition.
     *
     * @var DatabaseCondition
     */
    protected $condition;
    
    /**
     * Array of fields to update to an expression in case of a duplicate record.
     *
     * This variable is a nested array in the following format:
     * @code
     * <some field> => array(
     *  'condition' => <condition to execute, as a string>,
     *  'arguments' => <array of arguments for condition, or NULL for none>,
     * );
     * @endcode
     *
     * @var array
     */
    protected $expressionFields = array();
    
    /**
     * Constructs an UpdateQuery object.
     *
     * @param DatabaseConnection $connection
     *   A DatabaseConnection object.
     * @param string $table
     *   Name of the table to associate with this query.
     * @param array $options
     *   Array of database options.
     */
    public function __construct(DatabaseConnection $connection, $table, array $options = array()) {
        $options['return'] = Database::RETURN_AFFECTED;
        parent::__construct($connection, $options);
        $this->table = $table;
        $this->condition = new DatabaseCondition('AND');
    }
    
    /**
     * Implements QueryConditionInterface::condition().
     */
    public function condition($field, $value = NULL, $operator = NULL) {
        $this->condition
            ->condition($field, $value, $operator);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::isNull().
     */
    public function isNull($field) {
        $this->condition
            ->isNull($field);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::isNotNull().
     */
    public function isNotNull($field) {
        $this->condition
            ->isNotNull($field);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::exists().
     */
    public function exists(SelectQueryInterface $select) {
        $this->condition
            ->exists($select);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::notExists().
     */
    public function notExists(SelectQueryInterface $select) {
        $this->condition
            ->notExists($select);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::conditions().
     */
    public function &conditions() {
        return $this->condition
            ->conditions();
    }
    
    /**
     * Implements QueryConditionInterface::arguments().
     */
    public function arguments() {
        return $this->condition
            ->arguments();
    }
    
    /**
     * Implements QueryConditionInterface::where().
     */
    public function where($snippet, $args = array()) {
        $this->condition
            ->where($snippet, $args);
        return $this;
    }
    
    /**
     * Implements QueryConditionInterface::compile().
     */
    public function compile(DatabaseConnection $connection, QueryPlaceholderInterface $queryPlaceholder) {
        return $this->condition
            ->compile($connection, $queryPlaceholder);
    }
    
    /**
     * Implements QueryConditionInterface::compiled().
     */
    public function compiled() {
        return $this->condition
            ->compiled();
    }
    
    /**
     * Adds a set of field->value pairs to be updated.
     *
     * @param $fields
     *   An associative array of fields to write into the database. The array keys
     *   are the field names and the values are the values to which to set them.
     *
     * @return UpdateQuery
     *   The called object.
     */
    public function fields(array $fields) {
        $this->fields = $fields;
        return $this;
    }
    
    /**
     * Specifies fields to be updated as an expression.
     *
     * Expression fields are cases such as counter=counter+1. This method takes
     * precedence over fields().
     *
     * @param $field
     *   The field to set.
     * @param $expression
     *   The field will be set to the value of this expression. This parameter
     *   may include named placeholders.
     * @param $arguments
     *   If specified, this is an array of key/value pairs for named placeholders
     *   corresponding to the expression.
     *
     * @return UpdateQuery
     *   The called object.
     */
    public function expression($field, $expression, array $arguments = NULL) {
        $this->expressionFields[$field] = array(
            'expression' => $expression,
            'arguments' => $arguments,
        );
        return $this;
    }
    
    /**
     * Executes the UPDATE query.
     *
     * @return
     *   The number of rows affected by the update.
     */
    public function execute() {
        // Expressions take priority over literal fields, so we process those first
        // and remove any literal fields that conflict.
        $fields = $this->fields;
        $update_values = array();
        foreach ($this->expressionFields as $field => $data) {
            if (!empty($data['arguments'])) {
                $update_values += $data['arguments'];
            }
            unset($fields[$field]);
        }
        // Because we filter $fields the same way here and in __toString(), the
        // placeholders will all match up properly.
        $max_placeholder = 0;
        foreach ($fields as $field => $value) {
            $update_values[':db_update_placeholder_' . $max_placeholder++] = $value;
        }
        if (count($this->condition)) {
            $this->condition
                ->compile($this->connection, $this);
            $update_values = array_merge($update_values, $this->condition
                ->arguments());
        }
        return $this->connection
            ->query((string) $this, $update_values, $this->queryOptions);
    }
    
    /**
     * Implements PHP magic __toString method to convert the query to a string.
     *
     * @return string
     *   The prepared statement.
     */
    public function __toString() {
        // Create a sanitized comment string to prepend to the query.
        $comments = $this->connection
            ->makeComment($this->comments);
        // Expressions take priority over literal fields, so we process those first
        // and remove any literal fields that conflict.
        $fields = $this->fields;
        $update_fields = array();
        foreach ($this->expressionFields as $field => $data) {
            $update_fields[] = $field . '=' . $data['expression'];
            unset($fields[$field]);
        }
        $max_placeholder = 0;
        foreach ($fields as $field => $value) {
            $update_fields[] = $field . '=:db_update_placeholder_' . $max_placeholder++;
        }
        $query = $comments . 'UPDATE {' . $this->connection
            ->escapeTable($this->table) . '} SET ' . implode(', ', $update_fields);
        if (count($this->condition)) {
            try {
                $this->condition
                    ->compile($this->connection, $this);
            } catch (InvalidQueryConditionOperatorException $e) {
                drupal_trigger_fatal_error($e->getMessage());
            }
            // There is an implicit string cast on $this->condition.
            $query .= "\nWHERE " . $this->condition;
        }
        return $query;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
Query::$comments protected property An array of comments that can be prepended to a query.
Query::$connection protected property The connection object on which to run this query.
Query::$connectionKey protected property The key of the connection object.
Query::$connectionTarget protected property The target of the connection object.
Query::$nextPlaceholder protected property The placeholder counter.
Query::$queryOptions protected property The query options to pass on to the connection object.
Query::$uniqueIdentifier protected property A unique identifier for this query object.
Query::comment public function Adds a comment to the query.
Query::getComments public function Returns a reference to the comments array for the query.
Query::nextPlaceholder public function Gets the next placeholder value for this query object. Overrides QueryPlaceholderInterface::nextPlaceholder
Query::uniqueIdentifier public function Returns a unique identifier for this object. Overrides QueryPlaceholderInterface::uniqueIdentifier
Query::__clone public function Implements the magic __clone function. 1
Query::__sleep public function Implements the magic __sleep function to disconnect from the database.
Query::__wakeup public function Implements the magic __wakeup function to reconnect to the database.
UpdateQuery::$arguments protected property An array of values to update to.
UpdateQuery::$condition protected property The condition object for this query.
UpdateQuery::$expressionFields protected property Array of fields to update to an expression in case of a duplicate record.
UpdateQuery::$fields protected property An array of fields that will be updated.
UpdateQuery::$table protected property The table to update.
UpdateQuery::arguments public function Implements QueryConditionInterface::arguments(). Overrides QueryConditionInterface::arguments
UpdateQuery::compile public function Implements QueryConditionInterface::compile(). Overrides QueryConditionInterface::compile
UpdateQuery::compiled public function Implements QueryConditionInterface::compiled(). Overrides QueryConditionInterface::compiled
UpdateQuery::condition public function Implements QueryConditionInterface::condition(). Overrides QueryConditionInterface::condition
UpdateQuery::conditions public function Implements QueryConditionInterface::conditions(). Overrides QueryConditionInterface::conditions
UpdateQuery::execute public function Executes the UPDATE query. Overrides Query::execute 2
UpdateQuery::exists public function Implements QueryConditionInterface::exists(). Overrides QueryConditionInterface::exists
UpdateQuery::expression public function Specifies fields to be updated as an expression.
UpdateQuery::fields public function Adds a set of field-&gt;value pairs to be updated.
UpdateQuery::isNotNull public function Implements QueryConditionInterface::isNotNull(). Overrides QueryConditionInterface::isNotNull
UpdateQuery::isNull public function Implements QueryConditionInterface::isNull(). Overrides QueryConditionInterface::isNull
UpdateQuery::notExists public function Implements QueryConditionInterface::notExists(). Overrides QueryConditionInterface::notExists
UpdateQuery::where public function Implements QueryConditionInterface::where(). Overrides QueryConditionInterface::where
UpdateQuery::__construct public function Constructs an UpdateQuery object. Overrides Query::__construct
UpdateQuery::__toString public function Implements PHP magic __toString method to convert the query to a string. Overrides Query::__toString 1

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.