function ManyToOneHelper::ensureMyTable
Same name in other branches
- 9 core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::ensureMyTable()
- 8.9.x core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::ensureMyTable()
- 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\viewsCode
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.