function Sql::ensurePath

Same name in other branches
  1. 9 core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::ensurePath()
  2. 8.9.x core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::ensurePath()
  3. 10 core/modules/views/src/Plugin/views/query/Sql.php \Drupal\views\Plugin\views\query\Sql::ensurePath()

Ensures the given table can be linked to the primary table in the JOINs.

This function uses recursion. If the tables needed to complete the path back to the primary table are not in the query they will be added, but additional copies will NOT be added if the table is already there.

2 calls to Sql::ensurePath()
Sql::addTable in core/modules/views/src/Plugin/views/query/Sql.php
Add a table to the query, ensuring the path exists.
Sql::ensureTable in core/modules/views/src/Plugin/views/query/Sql.php
Ensures a table exists in the queue.

File

core/modules/views/src/Plugin/views/query/Sql.php, line 699

Class

Sql
Views query plugin for an SQL query.

Namespace

Drupal\views\Plugin\views\query

Code

protected function ensurePath($table, $relationship = NULL, $join = NULL, $traced = [], $add = []) {
    if (!isset($relationship)) {
        $relationship = $this->view->storage
            ->get('base_table');
    }
    if (!array_key_exists($relationship, $this->relationships)) {
        return FALSE;
    }
    // If we do not have join info, fetch it.
    if (!isset($join)) {
        $join = $this->getJoinData($table, $this->relationships[$relationship]['base']);
    }
    // If it can't be fetched, this won't work.
    if (empty($join)) {
        return FALSE;
    }
    // Does a table along this path exist?
    if (isset($this->tables[$relationship][$table]) || $join && $join->leftTable == $relationship || $join && $join->leftTable == $this->relationships[$relationship]['table']) {
        // Make sure that we're linking to the correct table for our relationship.
        foreach (array_reverse($add) as $table => $path_join) {
            $this->queueTable($table, $relationship, $this->adjustJoin($path_join, $relationship));
        }
        return TRUE;
    }
    // Have we been this way?
    if (isset($traced[$join->leftTable])) {
        // We looped. Broken.
        return FALSE;
    }
    // Do we have to add this table?
    $left_join = $this->getJoinData($join->leftTable, $this->relationships[$relationship]['base']);
    if (!isset($this->tables[$relationship][$join->leftTable])) {
        $add[$join->leftTable] = $left_join;
    }
    // Keep looking.
    $traced[$join->leftTable] = TRUE;
    return $this->ensurePath($join->leftTable, $relationship, $left_join, $traced, $add);
}

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