You are here

protected function Schema::findPrimaryKeyColumns in Drupal 8

Same name in this branch
  1. 8 core/lib/Drupal/Core/Database/Schema.php \Drupal\Core\Database\Schema::findPrimaryKeyColumns()
  2. 8 core/lib/Drupal/Core/Database/Driver/sqlite/Schema.php \Drupal\Core\Database\Driver\sqlite\Schema::findPrimaryKeyColumns()
  3. 8 core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php \Drupal\Core\Database\Driver\pgsql\Schema::findPrimaryKeyColumns()
  4. 8 core/lib/Drupal/Core/Database/Driver/mysql/Schema.php \Drupal\Core\Database\Driver\mysql\Schema::findPrimaryKeyColumns()
Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php \Drupal\Core\Database\Driver\pgsql\Schema::findPrimaryKeyColumns()

Finds the primary key columns of a table, from the database.

Parameters

string $table: The name of the table.

Return value

string[]|false A simple array with the names of the columns composing the table's primary key, or FALSE if the table does not exist.

Throws

\RuntimeException If the driver does not override this method.

Overrides Schema::findPrimaryKeyColumns

File

core/lib/Drupal/Core/Database/Driver/pgsql/Schema.php, line 811

Class

Schema
PostgreSQL implementation of \Drupal\Core\Database\Schema.

Namespace

Drupal\Core\Database\Driver\pgsql

Code

protected function findPrimaryKeyColumns($table) {
  if (!$this
    ->tableExists($table)) {
    return FALSE;
  }

  // Fetch the 'indkey' column from 'pg_index' to figure out the order of the
  // primary key.
  // @todo Use 'array_position()' to be able to perform the ordering in SQL
  //   directly when 9.5 is the minimum  PostgreSQL version.
  $result = $this->connection
    ->query("SELECT a.attname, i.indkey FROM pg_index i JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = '{" . $table . "}'::regclass AND i.indisprimary")
    ->fetchAllKeyed();
  if (!$result) {
    return [];
  }
  $order = explode(' ', reset($result));
  $columns = array_combine($order, array_keys($result));
  ksort($columns);
  return array_values($columns);
}