You are here

protected function ViewsQueryAlter::moveEntityTable in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/workspaces/src/ViewsQueryAlter.php \Drupal\workspaces\ViewsQueryAlter::moveEntityTable()

Moves a 'workspace_association' table to appear before the given alias.

Because Workspace chains possibly pre-existing tables onto the 'workspace_association' table, we have to ensure that the 'workspace_association' table appears in the query before the alias it's chained on or the SQL is invalid.

Parameters

\Drupal\views\Plugin\views\query\Sql $query: The SQL query object.

string $workspace_association_table: The alias of the 'workspace_association' table.

string $alias: The alias of the table it needs to appear before.

2 calls to ViewsQueryAlter::moveEntityTable()
ViewsQueryAlter::alterQueryForEntityType in core/modules/workspaces/src/ViewsQueryAlter.php
Alters the entity type tables for a Views query.
ViewsQueryAlter::ensureRevisionTable in core/modules/workspaces/src/ViewsQueryAlter.php
Adds the revision table of an entity type to a query object.

File

core/modules/workspaces/src/ViewsQueryAlter.php, line 421

Class

ViewsQueryAlter
Defines a class for altering views queries.

Namespace

Drupal\workspaces

Code

protected function moveEntityTable(Sql $query, $workspace_association_table, $alias) {
  $table_queue =& $query
    ->getTableQueue();
  $keys = array_keys($table_queue);
  $current_index = array_search($workspace_association_table, $keys);
  $index = array_search($alias, $keys);

  // If it's already before our table, we don't need to move it, as we could
  // accidentally move it forward.
  if ($current_index < $index) {
    return;
  }
  $splice = [
    $workspace_association_table => $table_queue[$workspace_association_table],
  ];
  unset($table_queue[$workspace_association_table]);

  // Now move the item to the proper location in the array. Don't use
  // array_splice() because that breaks indices.
  $table_queue = array_slice($table_queue, 0, $index, TRUE) + $splice + array_slice($table_queue, $index, NULL, TRUE);
}