You are here

protected function DataProviderEntity::queryForListFilter in RESTful 7.2

Filter the query for list.

Parameters

\EntityFieldQuery $query: The query object.

Throws

\Drupal\restful\Exception\BadRequestException

See also

\RestfulEntityBase::getQueryForList

2 calls to DataProviderEntity::queryForListFilter()
DataProviderEntity::getQueryCount in src/Plugin/resource/DataProvider/DataProviderEntity.php
Prepare a query for RestfulEntityBase::count().
DataProviderEntity::getQueryForList in src/Plugin/resource/DataProvider/DataProviderEntity.php
Prepare a query for RestfulEntityBase::getList().

File

src/Plugin/resource/DataProvider/DataProviderEntity.php, line 646
Contains \Drupal\restful\Plugin\resource\DataProvider\DataProviderEntity.

Class

DataProviderEntity
Class DataProviderEntity.

Namespace

Drupal\restful\Plugin\resource\DataProvider

Code

protected function queryForListFilter(\EntityFieldQuery $query) {
  $resource_fields = $this->fieldDefinitions;
  $filters = $this
    ->parseRequestForListFilter();
  $this
    ->validateFilters($filters);
  foreach ($filters as $filter) {

    // Determine if filtering is by field or property.

    /* @var \Drupal\restful\Plugin\resource\Field\ResourceFieldEntityInterface $resource_field */
    if (!($resource_field = $resource_fields
      ->get($filter['public_field']))) {
      if (!static::isNestedField($filter['public_field'])) {

        // This is not a nested filter.
        continue;
      }
      if (!empty($filter['target'])) {

        // If we cannot find the field, it may be a nested filter. Check if
        // the target of that is the current resource.
        continue;
      }
      $this
        ->addNestedFilter($filter, $query);
      continue;
    }

    // Give the chance for other data providers to have a special handling for
    // a given field.
    $filter = $this
      ->alterFilterQuery($filter, $query);
    if (!empty($filter['processed'])) {

      // If the filter was already processed by the alter filters, continue.
      continue;
    }
    if (!($property_name = $resource_field
      ->getProperty())) {
      if (!$resource_field instanceof ResourceFieldEntityAlterableInterface) {
        throw new BadRequestException(sprintf('The current filter "%s" selection does not map to any entity property or Field API field and has no custom filtering.', $filter['public_field']));
      }

      // If there was no property but the resource field was filterable, do
      // not add the default field filtering.
      // TODO: This is a workaround. The filtering logic should live in the resource field class.
      return;
    }
    if (field_info_field($property_name)) {
      if ($this::isMultipleValuOperator($filter['operator'][0])) {
        $query
          ->fieldCondition($property_name, $resource_field
          ->getColumn(), $this
          ->getReferencedIds($filter['value'], $resource_field), $filter['operator'][0]);
        continue;
      }
      for ($index = 0; $index < count($filter['value']); $index++) {

        // If referencing an entity by an alternate ID, retrieve the actual
        // Drupal's entity ID using getReferencedId.
        $query
          ->fieldCondition($property_name, $resource_field
          ->getColumn(), $this
          ->getReferencedId($filter['value'][$index], $resource_field), $filter['operator'][$index]);
      }
    }
    else {
      $column = $this
        ->getColumnFromProperty($property_name);
      if ($this::isMultipleValuOperator($filter['operator'][0])) {
        $query
          ->propertyCondition($column, $this
          ->getReferencedIds($filter['value'], $resource_field), $filter['operator'][0]);
        continue;
      }
      for ($index = 0; $index < count($filter['value']); $index++) {
        $query
          ->propertyCondition($column, $this
          ->getReferencedId($filter['value'][$index], $resource_field), $filter['operator'][$index]);
      }
    }
  }
}