You are here

public function FieldConfigStorage::loadByProperties in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/modules/field/src/FieldConfigStorage.php \Drupal\field\FieldConfigStorage::loadByProperties()

Load entities by their property values.

Parameters

array $values: An associative array where the keys are the property names and the values are the values those properties must have.

Return value

\Drupal\Core\Entity\EntityInterface[] An array of entity objects indexed by their ids.

Overrides EntityStorageBase::loadByProperties

File

core/modules/field/src/FieldConfigStorage.php, line 103
Contains \Drupal\field\FieldConfigStorage.

Class

FieldConfigStorage
Controller class for fields.

Namespace

Drupal\field

Code

public function loadByProperties(array $conditions = array()) {

  // Include deleted fields if specified in the $conditions parameters.
  $include_deleted = isset($conditions['include_deleted']) ? $conditions['include_deleted'] : FALSE;
  unset($conditions['include_deleted']);
  $fields = array();

  // Get fields stored in configuration. If we are explicitly looking for
  // deleted fields only, this can be skipped, because they will be
  // retrieved from state below.
  if (empty($conditions['deleted'])) {
    if (isset($conditions['entity_type']) && isset($conditions['bundle']) && isset($conditions['field_name'])) {

      // Optimize for the most frequent case where we do have a specific ID.
      $id = $conditions['entity_type'] . '.' . $conditions['bundle'] . '.' . $conditions['field_name'];
      $fields = $this
        ->loadMultiple(array(
        $id,
      ));
    }
    else {

      // No specific ID, we need to examine all existing fields.
      $fields = $this
        ->loadMultiple();
    }
  }

  // Merge deleted fields (stored in state) if needed.
  if ($include_deleted || !empty($conditions['deleted'])) {
    $deleted_fields = $this->state
      ->get('field.field.deleted') ?: array();
    $deleted_storages = $this->state
      ->get('field.storage.deleted') ?: array();
    foreach ($deleted_fields as $id => $config) {

      // If the field storage itself is deleted, inject it directly in the field.
      if (isset($deleted_storages[$config['field_storage_uuid']])) {
        $config['field_storage'] = $this->entityManager
          ->getStorage('field_storage_config')
          ->create($deleted_storages[$config['field_storage_uuid']]);
      }
      $fields[$id] = $this
        ->create($config);
    }
  }

  // Collect matching fields.
  $matching_fields = array();
  foreach ($fields as $field) {

    // Some conditions are checked against the field storage.
    $field_storage = $field
      ->getFieldStorageDefinition();

    // Only keep the field if it matches all conditions.
    foreach ($conditions as $key => $value) {

      // Extract the actual value against which the condition is checked.
      switch ($key) {
        case 'field_name':
          $checked_value = $field_storage
            ->getName();
          break;
        case 'field_id':
        case 'field_storage_uuid':
          $checked_value = $field_storage
            ->uuid();
          break;
        case 'uuid':
          $checked_value = $field
            ->uuid();
          break;
        case 'deleted':
          $checked_value = $field
            ->isDeleted();
          break;
        default:
          $checked_value = $field
            ->get($key);
          break;
      }

      // Skip to the next field as soon as one condition does not match.
      if ($checked_value != $value) {
        continue 2;
      }
    }

    // When returning deleted fields, key the results by UUID since they
    // can include several fields with the same ID.
    $key = $include_deleted ? $field
      ->uuid() : $field
      ->id();
    $matching_fields[$key] = $field;
  }
  return $matching_fields;
}