Same name and namespace in other branches
  1. 8.9.x core/lib/Drupal/Core/Database/Query/Merge.php \Drupal\Core\Database\Query\Merge::execute()
  2. 9 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 370

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;
}