foreignKeyConstraintDefinitionForModel method
String?
foreignKeyConstraintDefinitionForModel(
- ModelDefinition model,
- FieldDefinition field, {
- 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';
}