1 | initial version |
To implement a Many to Many relationship using NestJs Sequelize and Mysql2, you can follow these steps:
User
and Event
, and you want to associate many Users
with many Events
, define the models like this:// User.model.ts
import { Column, Model, Table } from 'sequelize-typescript';
@Table
export class User extends Model<User> {
@Column
name: string;
}
// Event.model.ts
import { Column, Model, Table } from 'sequelize-typescript';
@Table
export class Event extends Model<Event> {
@Column
title: string;
}
userId
and eventId
like this:// UserEvent.model.ts
import { Column, ForeignKey, Model, Table } from 'sequelize-typescript';
import { Event } from './event.model';
import { User } from './user.model';
@Table
export class UserEvent extends Model<UserEvent> {
@ForeignKey(() => User)
@Column
userId: number;
@ForeignKey(() => Event)
@Column
eventId: number;
}
User
model, you can define the many-to-many association it has with the Event
model like this:// User.model.ts
import { BelongsToMany, Column, Model, Table } from 'sequelize-typescript';
import { Event } from './event.model';
import { UserEvent } from './user-event.model';
@Table
export class User extends Model<User> {
@Column
name: string;
@BelongsToMany(() => Event, () => UserEvent)
events: Event[];
}
Similarly, in the Event
model, you can define the many-to-many association it has with the User
model like this:
// Event.model.ts
import { BelongsToMany, Column, Model, Table } from 'sequelize-typescript';
import { Event } from './event.model';
import { UserEvent } from './user-event.model';
@Table
export class Event extends Model<Event> {
@Column
title: string;
@BelongsToMany(() => User, () => UserEvent)
users: User[];
}
sync
method, like this:// app.module.ts
import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
import { User } from './models/user.model';
import { Event } from './models/event.model';
import { UserEvent } from './models/user-event.model';
@Module({
imports: [
SequelizeModule.forRoot({
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'testdb',
models: [User, Event, UserEvent],
autoLoadModels: true,
synchronize: true
})
]
})
export class AppModule {}
This will create the necessary tables in the database, with the association table UserEvent
holding the associations between the User
and Event
models. You can then use Sequelize's methods to interact with the models and their associations, for example:
const user = await User.findOne({ where: { name: 'John' } });
const event = await Event.findOne({ where: { title: 'Event1' } });
// Associate the user with the event
await user.$add('event', event);
// Get all events associated with the user
const events = await user.$get('events');