function ManyToOneHelper::add_filter

File

drupal/core/modules/views/lib/Drupal/views/ManyToOneHelper.php, line 260
Definition of Drupal\views\ManyToOneHelper.

Class

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

Namespace

Drupal\views

Code

function add_filter() {
  if (empty($this->handler->value)) {
    return;
  }
  $this->handler
    ->ensureMyTable();

  // Shorten some variables:
  $field = $this
    ->getField();
  $options = $this->handler->options;
  $operator = $this->handler->operator;
  $formula = !empty($this->formula);
  $value = $this->handler->value;
  if (empty($options['group'])) {
    $options['group'] = 0;
  }

  // add_condition determines whether a single expression is enough(FALSE) or the
  // conditions should be added via an db_or()/db_and() (TRUE).
  $add_condition = TRUE;
  if ($operator == 'not') {
    $value = NULL;
    $operator = 'IS NULL';
    $add_condition = FALSE;
  }
  elseif ($operator == 'or' && empty($options['reduce_duplicates'])) {
    if (count($value) > 1) {
      $operator = 'IN';
    }
    else {
      $value = is_array($value) ? array_pop($value) : $value;
      $operator = '=';
    }
    $add_condition = FALSE;
  }
  if (!$add_condition) {
    if ($formula) {
      $placeholder = $this
        ->placeholder();
      if ($operator == 'IN') {
        $operator = "{$operator} IN({$placeholder})";
      }
      else {
        $operator = "{$operator} {$placeholder}";
      }
      $placeholders = array(
        $placeholder => $value,
      ) + $this->placeholders;
      $this->handler->query
        ->add_where_expression($options['group'], "{$field} {$operator}", $placeholders);
    }
    else {
      $placeholder = $this
        ->placeholder();
      if (count($this->handler->value) > 1) {
        $this->query
          ->add_where_expression(0, "{$field} {$operator}({$placeholder})", array(
          $placeholder => $value,
        ));
      }
      else {
        $this->handler->query
          ->add_where_expression(0, "{$field} {$operator} {$placeholder}", array(
          $placeholder => $value,
        ));
      }
    }
  }
  if ($add_condition) {
    $field = $this->handler->realField;
    $clause = $operator == 'or' ? db_or() : db_and();
    foreach ($this->handler->tableAliases as $value => $alias) {
      $clause
        ->condition("{$alias}.{$field}", $value);
    }

    // implode on either AND or OR.
    $this->handler->query
      ->add_where($options['group'], $clause);
  }
}