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