SqlContentEntityStorage::countFieldData

public SqlContentEntityStorage::countFieldData($storage_definition, $as_bool = FALSE)

Determines the number of entities with values for a given field.

Parameters

\Drupal\Core\Field\FieldStorageDefinitionInterface $storage_definition: The field for which to count data records.

bool $as_bool: (Optional) Optimises the query for checking whether there are any records or not. Defaults to FALSE.

Return value

bool|int The number of entities. If $as_bool parameter is TRUE then the value will either be TRUE or FALSE.

Overrides FieldableEntityStorageInterface::countFieldData

See also

\Drupal\Core\Entity\FieldableEntityStorageInterface::purgeFieldData()

File

core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php, line 1605

Class

SqlContentEntityStorage
A content entity database storage implementation.

Namespace

Drupal\Core\Entity\Sql

Code

public function countFieldData($storage_definition, $as_bool = FALSE) {
  // The table mapping contains stale data during a request when a field
  // storage definition is added, so bypass the internal storage definitions
  // and fetch the table mapping using the passed in storage definition.
  // @todo Fix this in https://www.drupal.org/node/2705205.
  $storage_definitions = $this->entityManager->getFieldStorageDefinitions($this->entityTypeId);
  $storage_definitions[$storage_definition->getName()] = $storage_definition;
  $table_mapping = $this->getTableMapping($storage_definitions);

  if ($table_mapping->requiresDedicatedTableStorage($storage_definition)) {
    $is_deleted = $this->storageDefinitionIsDeleted($storage_definition);
    if ($this->entityType->isRevisionable()) {
      $table_name = $table_mapping->getDedicatedRevisionTableName($storage_definition, $is_deleted);
    }
    else {
      $table_name = $table_mapping->getDedicatedDataTableName($storage_definition, $is_deleted);
    }
    $query = $this->database->select($table_name, 't');
    $or = $query->orConditionGroup();
    foreach ($storage_definition->getColumns() as $column_name => $data) {
      $or->isNotNull($table_mapping->getFieldColumnName($storage_definition, $column_name));
    }
    $query->condition($or);
    if (!$as_bool) {
      $query
      ->fields('t', array('entity_id'))
        ->distinct(TRUE);
    }
  }
  elseif ($table_mapping->allowsSharedTableStorage($storage_definition)) {
    // Ascertain the table this field is mapped too.
    $field_name = $storage_definition->getName();
    try {
      $table_name = $table_mapping->getFieldTableName($field_name);
    }
    catch (SqlContentEntityStorageException $e) {
      // This may happen when changing field storage schema, since we are not
      // able to use a table mapping matching the passed storage definition.
      // @todo Revisit this once we are able to instantiate the table mapping
      //   properly. See https://www.drupal.org/node/2274017.
      $table_name = $this->dataTable ? : $this->baseTable;
    }
    $query = $this->database->select($table_name, 't');
    $or = $query->orConditionGroup();
    foreach (array_keys($storage_definition->getColumns()) as $property_name) {
      $or->isNotNull($table_mapping->getFieldColumnName($storage_definition, $property_name));
    }
    $query->condition($or);
    if (!$as_bool) {
      $query
      ->fields('t', array($this->idKey))
        ->distinct(TRUE);
    }
  }

  // @todo Find a way to count field data also for fields having custom
  //   storage. See https://www.drupal.org/node/2337753.
  $count = 0;
  if (isset($query)) {
    // If we are performing the query just to check if the field has data
    // limit the number of rows.
    if ($as_bool) {
      $query
      ->range(0, 1)
        ->addExpression('1');
    }
    else {
      // Otherwise count the number of rows.
      $query = $query->countQuery();
    }
    $count = $query->execute()->fetchField();
  }
  return $as_bool ? (bool) $count : (int) $count;
}
doc_Drupal
2016-10-29 09:43:20
Comments
Leave a Comment

Please login to continue.