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\DataProviderCode
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]);
}
}
}
}