function ManyToOneHelper::ensureMyTable

Same name and namespace in other branches
  1. 9 core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::ensureMyTable()
  2. 8.9.x core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::ensureMyTable()
  3. 10 core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::ensureMyTable()

Override ensureMyTable so we can control how this joins in.

The operator actually has influence over joining.

File

core/modules/views/src/ManyToOneHelper.php, line 174

Class

ManyToOneHelper
This many to one helper object is used on both arguments and filters.

Namespace

Drupal\views

Code

public function ensureMyTable() {
    if (!isset($this->handler->tableAlias)) {
        // Case 1: Operator is an 'or' and we're not reducing duplicates.
        // We hence get the absolute simplest:
        $field = $this->handler->relationship . '_' . $this->handler->table . '.' . $this->handler->field;
        if ($this->handler->operator == 'or' && empty($this->handler->options['reduce_duplicates'])) {
            if (empty($this->handler->options['add_table']) && empty($this->handler->view->many_to_one_tables[$field])) {
                // query optimization, INNER joins are slightly faster, so use them
                // when we know we can.
                $join = $this->getJoin();
                $group = $this->handler->options['group'] ?? FALSE;
                // Only if there is no group with OR operator.
                if (isset($join) && !($group && $this->handler->query->where[$group]['type'] === 'OR')) {
                    $join->type = 'INNER';
                }
                $this->handler->tableAlias = $this->handler->query
                    ->ensureTable($this->handler->table, $this->handler->relationship, $join);
                $this->handler->view->many_to_one_tables[$field] = $this->handler->value;
            }
            else {
                $join = $this->getJoin();
                $join->type = 'LEFT';
                if (!empty($this->handler->view->many_to_one_tables[$field])) {
                    foreach ($this->handler->view->many_to_one_tables[$field] as $value) {
                        $join->extra = [
                            [
                                'field' => $this->handler->realField,
                                'operator' => '!=',
                                'value' => $value,
                                'numeric' => !empty($this->handler->definition['numeric']),
                            ],
                        ];
                    }
                }
                $this->handler->tableAlias = $this->addTable($join);
            }
            return $this->handler->tableAlias;
        }
        // Case 2: it's an 'and' or an 'or'.
        // We do one join per selected value.
        if ($this->handler->operator != 'not') {
            // Clone the join for each table:
            $this->handler->tableAliases = [];
            foreach ($this->handler->value as $value) {
                $join = $this->getJoin();
                if ($this->handler->operator == 'and') {
                    $join->type = 'INNER';
                }
                $join->extra = [
                    [
                        'field' => $this->handler->realField,
                        'value' => $value,
                        'numeric' => !empty($this->handler->definition['numeric']),
                    ],
                ];
                // The table alias needs to be unique to this value across the
                // multiple times the filter or argument is called by the view.
                if (!isset($this->handler->view->many_to_one_aliases[$field][$value])) {
                    if (!isset($this->handler->view->many_to_one_count[$this->handler->table])) {
                        $this->handler->view->many_to_one_count[$this->handler->table] = 0;
                    }
                    $this->handler->view->many_to_one_aliases[$field][$value] = $this->handler->table . '_value_' . $this->handler->view->many_to_one_count[$this->handler->table]++;
                }
                $this->handler->tableAliases[$value] = $this->addTable($join, $this->handler->view->many_to_one_aliases[$field][$value]);
                // Set tableAlias to the first of these.
                if (empty($this->handler->tableAlias)) {
                    $this->handler->tableAlias = $this->handler->tableAliases[$value];
                }
            }
        }
        else {
            $join = $this->getJoin();
            $join->type = 'LEFT';
            $join->extra = [];
            $join->extraOperator = 'OR';
            foreach ($this->handler->value as $value) {
                $join->extra[] = [
                    'field' => $this->handler->realField,
                    'value' => $value,
                    'numeric' => !empty($this->handler->definition['numeric']),
                ];
            }
            $this->handler->tableAlias = $this->addTable($join);
        }
    }
    return $this->handler->tableAlias;
}

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