Same name in this branch
  1. 10 core/lib/Drupal/Core/Database/Query/Insert.php \Drupal\Core\Database\Query\Insert::execute()
  2. 10 core/modules/mysql/src/Driver/Database/mysql/Insert.php \Drupal\mysql\Driver\Database\mysql\Insert::execute()
  3. 10 core/modules/pgsql/src/Driver/Database/pgsql/Insert.php \Drupal\pgsql\Driver\Database\pgsql\Insert::execute()
  4. 10 core/modules/sqlite/src/Driver/Database/sqlite/Insert.php \Drupal\sqlite\Driver\Database\sqlite\Insert::execute()
Same name and namespace in other branches
  1. 8.9.x core/lib/Drupal/Core/Database/Query/Insert.php \Drupal\Core\Database\Query\Insert::execute()
  2. 9 core/lib/Drupal/Core/Database/Query/Insert.php \Drupal\Core\Database\Query\Insert::execute()

Executes the insert query.

Return value

int|null|string The last insert ID of the query, if one exists. If the query was given multiple sets of values to insert, the return value is undefined. If no fields are specified, this method will do nothing and return NULL. That That makes it safe to use in multi-insert loops.

Overrides Query::execute

3 methods override Insert::execute()
Insert::execute in core/modules/mysql/src/Driver/Database/mysql/Insert.php
Executes the insert query.
Insert::execute in core/modules/pgsql/src/Driver/Database/pgsql/Insert.php
Executes the insert query.
Insert::execute in core/modules/sqlite/src/Driver/Database/sqlite/Insert.php
Executes the insert query.

File

core/lib/Drupal/Core/Database/Query/Insert.php, line 66

Class

Insert
General class for an abstracted INSERT query.

Namespace

Drupal\Core\Database\Query

Code

public function execute() {

  // If validation fails, simply return NULL. Note that validation routines
  // in preExecute() may throw exceptions instead.
  if (!$this
    ->preExecute()) {
    return NULL;
  }

  // If we're selecting from a SelectQuery, finish building the query and
  // pass it back, as any remaining options are irrelevant.
  if (!empty($this->fromQuery)) {
    $sql = (string) $this;

    // The SelectQuery may contain arguments, load and pass them through.
    return $this->connection
      ->query($sql, $this->fromQuery
      ->getArguments(), $this->queryOptions);
  }
  $last_insert_id = 0;
  $stmt = $this->connection
    ->prepareStatement((string) $this, $this->queryOptions);
  try {

    // Per https://en.wikipedia.org/wiki/Insert_%28SQL%29#Multirow_inserts,
    // not all databases implement SQL-92's standard syntax for multi-row
    // inserts. Therefore, in the degenerate case, execute a separate query
    // for each row, all within a single transaction for atomicity and
    // performance.
    $transaction = $this->connection
      ->startTransaction();
    foreach ($this->insertValues as $insert_values) {
      $stmt
        ->execute($insert_values, $this->queryOptions);
      $last_insert_id = $this->connection
        ->lastInsertId();
    }
  } catch (\Exception $e) {
    if (isset($transaction)) {

      // One of the INSERTs failed, rollback the whole batch.
      $transaction
        ->rollBack();
    }

    // Rethrow the exception for the calling code.
    throw $e;
  }

  // Re-initialize the values array so that we can re-use this query.
  $this->insertValues = [];

  // Transaction commits here where $transaction looses scope.
  return $last_insert_id;
}