function Merge::execute

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Database/Query/Merge.php \Drupal\Core\Database\Query\Merge::execute()
  2. 8.9.x core/lib/Drupal/Core/Database/Query/Merge.php \Drupal\Core\Database\Query\Merge::execute()
  3. 10 core/lib/Drupal/Core/Database/Query/Merge.php \Drupal\Core\Database\Query\Merge::execute()

Executes the merge database query.

Return value

int|null One of the following values:

Throws

\Drupal\Core\Database\Query\InvalidMergeQueryException When there are no conditions found to merge.

Overrides Query::execute

File

core/lib/Drupal/Core/Database/Query/Merge.php, line 360

Class

Merge
General class for an abstracted MERGE query operation.

Namespace

Drupal\Core\Database\Query

Code

public function execute() {
    if (!count($this->condition)) {
        throw new InvalidMergeQueryException('Invalid merge query: no conditions');
    }
    $select = $this->connection
        ->select($this->conditionTable)
        ->condition($this->condition);
    $select->addExpression('1');
    if (!$select->execute()
        ->fetchField()) {
        try {
            $insert = $this->connection
                ->insert($this->table)
                ->fields($this->insertFields);
            if ($this->defaultFields) {
                $insert->useDefaults($this->defaultFields);
            }
            $insert->execute();
            return self::STATUS_INSERT;
        } catch (IntegrityConstraintViolationException $e) {
            // The insert query failed, maybe it's because a racing insert query
            // beat us in inserting the same row. Retry the select query, if it
            // returns a row, ignore the error and continue with the update
            // query below.
            if (!$select->execute()
                ->fetchField()) {
                throw $e;
            }
        }
    }
    if ($this->needsUpdate) {
        $update = $this->connection
            ->update($this->table)
            ->fields($this->updateFields)
            ->condition($this->condition);
        if ($this->expressionFields) {
            foreach ($this->expressionFields as $field => $data) {
                $update->expression($field, $data['expression'], $data['arguments']);
            }
        }
        $update->execute();
        return self::STATUS_UPDATE;
    }
    return NULL;
}

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