foreignKeyConstraintDefinitionForModel method

String? foreignKeyConstraintDefinitionForModel(
  1. ModelDefinition model,
  2. FieldDefinition field, {
  3. SchemaDocument? schema,
})

Returns the foreign key definition fragment for field, if any.

Implementation

String? foreignKeyConstraintDefinitionForModel(
  ModelDefinition model,
  FieldDefinition field, {
  SchemaDocument? schema,
}) {
  final relation = field.attribute('relation');
  if (relation == null) {
    return null;
  }

  final localFields = _parseListArgument(relation.arguments['fields']);
  final targetFields = _parseListArgument(relation.arguments['references']);
  if (localFields.isEmpty || localFields.length != targetFields.length) {
    return null;
  }

  final constraintName = foreignKeyConstraintNameForModel(model, field);
  if (constraintName == null) {
    return null;
  }

  final targetModel = schema?.findModel(field.type);
  final localColumns = localFields
      .map(
        (fieldName) => _quoteIdentifier(
          model.findField(fieldName)?.databaseName ?? fieldName,
        ),
      )
      .join(', ');
  final targetColumns = targetFields
      .map(
        (fieldName) => _quoteIdentifier(
          targetModel?.findField(fieldName)?.databaseName ?? fieldName,
        ),
      )
      .join(', ');
  final targetTable = targetModel?.databaseName ?? field.type;
  final onDelete = _referentialActionClause(
    'ON DELETE',
    relation.arguments['onDelete'],
  );
  final onUpdate = _referentialActionClause(
    'ON UPDATE',
    relation.arguments['onUpdate'],
  );
  return 'CONSTRAINT ${_quoteIdentifier(constraintName)} '
      'FOREIGN KEY ($localColumns) '
      'REFERENCES ${_quoteIdentifier(targetTable)} ($targetColumns)$onDelete$onUpdate';
}