function IndexTidDepth::query

Same name and namespace in other branches
  1. 9 core/modules/taxonomy/src/Plugin/views/argument/IndexTidDepth.php \Drupal\taxonomy\Plugin\views\argument\IndexTidDepth::query()
  2. 10 core/modules/taxonomy/src/Plugin/views/argument/IndexTidDepth.php \Drupal\taxonomy\Plugin\views\argument\IndexTidDepth::query()
  3. 11.x core/modules/taxonomy/src/Plugin/views/argument/IndexTidDepth.php \Drupal\taxonomy\Plugin\views\argument\IndexTidDepth::query()

Overrides ArgumentPluginBase::query

File

core/modules/taxonomy/src/Plugin/views/argument/IndexTidDepth.php, line 97

Class

IndexTidDepth
Argument handler for taxonomy terms with depth.

Namespace

Drupal\taxonomy\Plugin\views\argument

Code

public function query($group_by = FALSE) {
    $this->ensureMyTable();
    if (!empty($this->options['break_phrase'])) {
        $break = static::breakString($this->argument);
        if ($break->value === [
            -1,
        ]) {
            return FALSE;
        }
        $operator = count($break->value) > 1 ? 'IN' : '=';
        $tids = $break->value;
    }
    else {
        $operator = "=";
        $tids = $this->argument;
    }
    // Now build the subqueries.
    $subquery = Database::getConnection()->select('taxonomy_index', 'tn');
    $subquery->addField('tn', 'nid');
    $where = (new Condition('OR'))->condition('tn.tid', $tids, $operator);
    $last = "tn";
    if ($this->options['depth'] > 0) {
        $subquery->leftJoin('taxonomy_term__parent', 'th', "th.entity_id = tn.tid");
        $last = "th";
        foreach (range(1, abs($this->options['depth'])) as $count) {
            $subquery->leftJoin('taxonomy_term__parent', "th{$count}", "{$last}.parent_target_id = th{$count}.entity_id");
            $where->condition("th{$count}.entity_id", $tids, $operator);
            $last = "th{$count}";
        }
    }
    elseif ($this->options['depth'] < 0) {
        foreach (range(1, abs($this->options['depth'])) as $count) {
            $field = $count == 1 ? 'tid' : 'entity_id';
            $subquery->leftJoin('taxonomy_term__parent', "th{$count}", "{$last}.{$field} = th{$count}.parent_target_id");
            $where->condition("th{$count}.entity_id", $tids, $operator);
            $last = "th{$count}";
        }
    }
    $subquery->condition($where);
    $this->query
        ->addWhere(0, "{$this->tableAlias}.{$this->realField}", $subquery, 'IN');
}

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