function FieldConfigStorage::loadByProperties

Same name in other branches
  1. 8.9.x core/modules/field/src/FieldConfigStorage.php \Drupal\field\FieldConfigStorage::loadByProperties()
  2. 10 core/modules/field/src/FieldConfigStorage.php \Drupal\field\FieldConfigStorage::loadByProperties()
  3. 11.x core/modules/field/src/FieldConfigStorage.php \Drupal\field\FieldConfigStorage::loadByProperties()

Overrides EntityStorageBase::loadByProperties

File

core/modules/field/src/FieldConfigStorage.php, line 102

Class

FieldConfigStorage
Storage handler for field config.

Namespace

Drupal\field

Code

public function loadByProperties(array $conditions = []) {
    // Include deleted fields if specified in the $conditions parameters.
    $include_deleted = $conditions['include_deleted'] ?? FALSE;
    unset($conditions['include_deleted']);
    $fields = [];
    // Get fields stored in configuration. If we are explicitly looking for
    // deleted fields only, this can be skipped, because they will be
    // retrieved from the deleted fields repository 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([
                $id,
            ]);
        }
        else {
            // No specific ID, we need to examine all existing fields.
            $fields = $this->loadMultiple();
        }
    }
    // Merge deleted fields from the deleted fields repository if needed.
    if ($include_deleted || !empty($conditions['deleted'])) {
        $deleted_field_definitions = $this->deletedFieldsRepository
            ->getFieldDefinitions();
        foreach ($deleted_field_definitions as $id => $field_definition) {
            if ($field_definition instanceof FieldConfigInterface) {
                $fields[$id] = $field_definition;
            }
        }
    }
    // Collect matching fields.
    $matching_fields = [];
    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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.