function ManyToOneHelper::addTable
Same name in other branches
- 9 core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::addTable()
- 10 core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::addTable()
- 11.x core/modules/views/src/ManyToOneHelper.php \Drupal\views\ManyToOneHelper::addTable()
Add a table to the query.
This is an advanced concept; not only does it add a new instance of the table, but it follows the relationship path all the way down to the relationship link point and adds *that* as a new relationship and then adds the table to the relationship, if necessary.
2 calls to ManyToOneHelper::addTable()
- ManyToOneHelper::ensureMyTable in core/
modules/ views/ src/ ManyToOneHelper.php - Override ensureMyTable so we can control how this joins in. The operator actually has influence over joining.
- ManyToOneHelper::summaryJoin in core/
modules/ views/ src/ ManyToOneHelper.php - Provide the proper join for summary queries. This is important in part because it will cooperate with other arguments if possible.
File
-
core/
modules/ views/ src/ ManyToOneHelper.php, line 64
Class
- ManyToOneHelper
- This many to one helper object is used on both arguments and filters.
Namespace
Drupal\viewsCode
public function addTable($join = NULL, $alias = NULL) {
// This is used for lookups in the many_to_one table.
$field = $this->handler->relationship . '_' . $this->handler->table . '.' . $this->handler->field;
if (empty($join)) {
$join = $this->getJoin();
}
// See if there's a chain between us and the base relationship. If so, we need
// to create a new relationship to use.
$relationship = $this->handler->relationship;
// Determine the primary table to seek
if (empty($this->handler->query->relationships[$relationship])) {
$base_table = $this->handler->view->storage
->get('base_table');
}
else {
$base_table = $this->handler->query->relationships[$relationship]['base'];
}
// Cycle through the joins. This isn't as error-safe as the normal
// ensurePath logic. Perhaps it should be.
$r_join = clone $join;
while ($r_join->leftTable != $base_table) {
$r_join = HandlerBase::getTableJoin($r_join->leftTable, $base_table);
}
// If we found that there are tables in between, add the relationship.
if ($r_join->table != $join->table) {
$relationship = $this->handler->query
->addRelationship($this->handler->table . '_' . $r_join->table, $r_join, $r_join->table, $this->handler->relationship);
}
// And now add our table, using the new relationship if one was used.
$alias = $this->handler->query
->addTable($this->handler->table, $relationship, $join, $alias);
// Store what values are used by this table chain so that other chains can
// automatically discard those values.
if (empty($this->handler->view->many_to_one_tables[$field])) {
$this->handler->view->many_to_one_tables[$field] = $this->handler->value;
}
else {
$this->handler->view->many_to_one_tables[$field] = array_merge($this->handler->view->many_to_one_tables[$field], $this->handler->value);
}
return $alias;
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.