For one-to-one relation in database schema, it is easy to define the relation in Model Class using Sequelize BelongsTo method. Let us consider a schema given below which has Users and UserProfile models. One user can have one UserProfile, Which is 1-to-1 relation.
One-to-One Relation using belongsTo in Sequelize
Users Model
const UserModel = db.define(
'users',
{
userId: {
field: 'userId',
type: sqlOperator.UUID,
primaryKey: true,
defaultValue: sqlOperator.UUIDV4
},
firstName: {
field: 'firstName',
type: sqlOperator.STRING(100),
require: true
},
lastName: {
field: 'lastName',
type: sqlOperator.STRING(100),
},
email: {
field: 'email',
type: sqlOperator.STRING(255),
defaultValue: null,
allowNull: true,
// unique: true,
validate: {
isEmail: true
}
},
userName: {
field: 'userName',
type: sqlOperator.STRING(255),
defaultValue: null,
allowNull: true,
// unique: true
},
phone: {
field: 'phone',
type: sqlOperator.STRING(13),
allowNull: true,
// unique: true
},
photo: {
field: 'photo',
type: sqlOperator.STRING(1024),
defaultValue: null,
validate: {
isUrl: true
}
},
},
{
tableName: 'users',
timestamps: true,
freezeTableName: true,
}
);
UserModel.associate = async () => {
console.log('--- Establishing relations between user and user profile ---');
const UserProfileModel = require('./UserProfileModel');
UserModel.belongsTo(UserProfileModel, {
foreignKey: 'profile',
targetKey: 'userProfileId'
}); /** foriengKey and targetKey are both from table */
}
module.exports = UserModel;
UserProfile Model
const UserProfileModel = db.define(
'user_profiles',
{
userProfileId: {
field: 'userProfileId',
type: sqlOperator.UUID,
primaryKey: true,
defaultValue: sqlOperator.UUIDV4
},
address: {
field: 'address',
type: sqlOperator.STRING(100),
require: true
}
},
{
tableName: 'user_profiles',
timestamps: true,
}
);
UserProfileModel.associate = async () => {
console.log('--- Establishing relations between user profile ---');
}
module.exports = UserProfileModel;
While defining one to one relation, relation can be defined in any of the model, either User Model or UserProfile model. It will work fine with any way.
Let us understand foreign key and target key in belongsTo as given above.
foreignKey: ‘profile’, since we are defining relation in Users Model, the user profile id will be added to users table and that is why it become one to one relation. Hence foreignKey here means the column name to be added in Source Table that is Users Model.
targetKey: ‘userProfileId’, here the Source is Users model and since we are defining relation in Users Model, then the target model is UserProfiles model, hence the target key here is the primary key of UserProfile table.
As per sequelize documentation, it says “BelongsTo inserts the association key in the source model”, source model here is Users Model.
Read more about Defining One-To-Many relation using sequelize