You are here

public function EntityQueueRelationship::query in Entityqueue 8

Add anything to the query that we might need to.

Overrides RelationshipPluginBase::query

File

src/Plugin/views/relationship/EntityQueueRelationship.php, line 150

Class

EntityQueueRelationship
A relationship handler for entity queues.

Namespace

Drupal\entityqueue\Plugin\views\relationship

Code

public function query() {

  // Add a 'where' condition if needed.
  if (!empty($this->definition['extra'])) {
    $bundles = [];

    // Future-proofing: support any number of selected bundles.
    foreach ($this->definition['extra'] as $extra) {
      if ($extra['field'] == 'bundle') {
        $bundles[] = $extra['value'];
      }
    }
    if (count($bundles) > 0) {
      $this->definition['join_extra'][] = [
        'field' => 'bundle',
        'value' => $bundles,
      ];
    }
  }

  // Now - let's build the query.
  // @todo We can't simply call parent::query() because the parent class does
  //   not handle the 'join_id' configuration correctly, so we can't use our
  //   custom 'casted_field_join' plugin.
  $this
    ->ensureMyTable();

  // First, relate our base table to the current base table to the
  // field, using the base table's id field to the field's column.
  $views_data = Views::viewsData()
    ->get($this->table);
  $left_field = $views_data['table']['base']['field'];
  $first = [
    'left_table' => $this->tableAlias,
    'left_field' => $left_field,
    'table' => $this->definition['field table'],
    'field' => $this->definition['field field'],
    'adjusted' => TRUE,
    'entity_type' => isset($views_data['table']['entity type']) ? $views_data['table']['entity type'] : NULL,
  ];
  if (!empty($this->options['required'])) {
    $first['type'] = 'INNER';
  }
  if (!empty($this->definition['join_extra'])) {
    $first['extra'] = $this->definition['join_extra'];
  }

  // Use our custom 'casted_field_join' handler in order to handle
  // relationships to integers and strings IDs from the same table properly.
  $first_join = $this->joinManager
    ->createInstance('casted_field_join', $first);
  $this->first_alias = $this->query
    ->addTable($this->definition['field table'], $this->relationship, $first_join);

  // Second, relate the field table to the entity specified using
  // the entity id on the field table and the entity's id field.
  $second = [
    'left_table' => $this->first_alias,
    'left_field' => 'entity_id',
    'table' => $this->definition['base'],
    'field' => $this->definition['base field'],
    'adjusted' => TRUE,
  ];
  if (!empty($this->options['required'])) {
    $second['type'] = 'INNER';
  }
  if (!empty($this->definition['join_id'])) {
    $id = $this->definition['join_id'];
  }
  else {
    $id = 'standard';
  }
  $second_join = $this->joinManager
    ->createInstance($id, $second);
  $second_join->adjusted = TRUE;

  // Use a short alias for this:
  $alias = $this->definition['field_name'] . '_' . $this->table;
  $this->alias = $this->query
    ->addRelationship($alias, $second_join, $this->definition['base'], $this->relationship);
}