In my backend y try with orm sequelize
create a model User
with its association ContactDateTime
.
The ContactDateTime
–association is missing fields/attributes after create
user.ts
import ...
/**
*
*/
class User
extends Model<InferAttributes<User>, InferCreationAttributes<User>>
implements OrmModelInterface {
declare id: CreationOptional<string>;
declare lastName: string;
declare email: string;
/**
* Association UserContactDateTime
*/
declare createContactDateTime: HasOneCreateAssociationMixin<UserContactDateTime>;
declare getContactDateTime: HasOneGetAssociationMixin<UserContactDateTime>;
declare contactDateTime?: NonAttribute<UserContactDateTime>;
declare updatedAt: Date;
declare createdAt: Date;
}
User.init(
{
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.UUID,
defaultValue: UUIDV4
},
lastName: {
type: DataTypes.STRING(255),
validate: {
notEmpty: {
msg: 'Attribute surname cannot be empty!'
}
}
},
email: {
type: DataTypes.STRING(255),
validate: {
isEmail: {
msg: 'Email is invalid!'
}
}
},
updatedAt: DataTypes.DATE,
createdAt: DataTypes.DATE,
},
{
sequelize
}
)
User.hasOne(UserContactDateTime, {
sourceKey: 'id',
foreignKey: 'clientId',
as: 'ContactDateTime'
})
export default User;
contact_date_time.ts
import ...
class UserContactDateTime
extends Model<InferAttributes<UserContactDateTime>, InferCreationAttributes<UserContactDateTime>>
{
declare clientId: ForeignKey<User['id']>;
declare desiredContactDate: Date;
declare desiredContactTimeFrom: string;
declare desiredContactTimeTo: string;
declare updatedAt: Date;
declare createdAt: Date;
}
UserContactDateTime.init(
{
clientId: {
allowNull: false,
type: DataTypes.UUIDV4,
primaryKey: true
},
desiredContactDate: DataTypes.DATEONLY,
desiredContactTimeFrom: DataTypes.TIME,
desiredContactTimeTo: DataTypes.TIME,
updatedAt: DataTypes.DATE,
createdAt: DataTypes.DATE
},
{
sequelize
}
)
export default UserContactDateTime;
Tables & foreign keys already generated.
Request payload
{
"last_name":"User",
"email":"[email protected]",
"contact_date_time":{
"clientId":null,
"contactDate":"2024-05-27",
"contactTimeFrom":"09:00",
"contactTimeTo":"18:00"
}
}
The user.controller
to execute the query
user.controller.ts
import ...
class UserController
implements OrmModelControllerInterface
{
private model: any;
constructor(
model: any
) {
this.model = model;
}
/**
*
* @param req
* @param res
*/
async post(req: Request, res: Response)
{
const date = new Date();
try {
const model = await this.model.create(
{
lastName: req.body.last_name,
email: req.body.email,
updatedAt: date,
createdAt: date
},
{
include: [
{
model: UserContactDateTime,
as: 'ContactDateTime'
}
]
}
);
res.send({id: model.id});
} catch (error: any) {
res.send(error.message);
}
}
}
With the configuration above, the user
is created, but the UserContactDateTime
only populate attributes clientId
, createdAt
and updatedAt
Generated by sequelize
: mysql queries console output
INSERT INTO `User` (`id`,`lastName`,`email`,`updatedAt`,`createdAt`) VALUES (?,?,?,?,?,?,?,?,?);
INSERT INTO `UserContactDateTime` (`clientId`,`updatedAt`,`createdAt`) VALUES (?,?,?);
How to force sequelize
to insert the missing values?