Quantcast
Channel: Issues for Drupal core
Viewing all articles
Browse latest Browse all 291671

UniqueFieldConstraint does not work when the constraint is on the ID field

$
0
0

Problem/Motivation

The constraint can only be added on non-ID fields, and doesn't take into account if the unique field being checked is a (non-incremementing) ID itself.

Steps to reproduce

Given the following field definition:

public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    $fields = parent::baseFieldDefinitions($entity_type);

    $fields['id'] = BaseFieldDefinition::create('string')
      ->setLabel(t('My unique String ID'))
      ->setRequired(TRUE)
      ->setReadOnly(TRUE)
      ->setDescription(t('The non-numeric string ID.'))
      ->addConstraint('UniqueField');
   // ...
}

The validation will never pass.

Due to the following line: https://git.drupalcode.org/project/drupal/-/blob/96aa5ca5/core/lib/Drupa...

Where it checks if the ID does not equal to itself.

Proposed resolution

There should be special logic in place to handle when the field is an ID itself (or a special validation constraint introduced specifically for ID fields).

Using something like:

    $entity_id = $field_name === $id_key ? $entity->getOriginalId() : $entity->id();
    // Using isset() instead of !empty() as 0 and '0' are valid ID values for
    // entity types using string IDs.
    if (isset($entity_id)) {
      $query->condition($id_key, $entity_id, '<>');
    }

Remaining tasks

  • Provide working patch with test coverage.

User interface changes

None.

API changes

None.

Data model changes

None.

Release notes snippet

N/A


Viewing all articles
Browse latest Browse all 291671

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>