시퀄라이즈에서 일대일, 일대다, 다대다 관계를 설정하는 방법을 다룬다.
const A = sequelize.define('A', /* ... */);
const B = sequelize.define('B', /* ... */);
A.hasOne(B);
B.belongsTo(A);
위 두 메소드를 호출하면 시퀄라이즈는 자동으로 적당한 테이블에 foreign 칼럼을 생성해준다.
'다' 관계를 설정해주는 아래의 메소드들도 있다.
A.hasMany(B);
A.belongsToMany(B, { through: 'C' }); // A와 B의 다대다 관계 설정을 위해 C 테이블을 자동으로 생성해주기까지 한다.
1. 일대일
관계 설정은 보통 패어로 이뤄진다.
그래야 각 테이블에 해당하는 두 인스턴스가 서로의 관계를 알고
각 인스턴스에서 다른 인스턴스까지도 불러올 수 있는 메소드를 호출할 수 있다.
하나만 설정해주면 한쪽에서만 호출할 수 있다.
Foo.hasOne(Bar);
Bar.belongsTo(Foo);
위와 같이 두 번째 인자에 아무 옵션도 넣어주지 않으면
시퀄라이즈는 이름을 추론해서 자동으로 Bar 테이블에 foreign 칼럼을 fooId로 설정한다.
칼럼의 이름을 다르게 하고 싶다면 매뉴얼을 참고하자.
Bar.sync();를 호출하면 다른 칼럼들과 함께 데이터베이스에도 생성된다.
2. 일대다
일대다 관계는 다음과 같이한다.
작동원리는 위와 동일하다.
Team.hasMany(Player);
Player.belongsTo(Team);
3. 다대다
기본적으로는 다음과 같이 구현한다.
const Movie = sequelize.define('Movie', { name: DataTypes.STRING });
const Actor = sequelize.define('Actor', { name: DataTypes.STRING });
Movie.belongsToMany(Actor, { through: 'ActorMovies' });
Actor.belongsToMany(Movie, { through: 'ActorMovies' });
through 속성에 넣어준 string 값에 따라서
시퀄라이즈는 자동으로 ActorMovies라는 모델을 생성한다.
ActorMovies는 다대다 관계를 이어주는 테이블이다.
https://sequelize.org/master/manual/assocs.html
4. Join해서 불러오는 방법
const User = sequelize.define('user', { name: DataTypes.STRING }, { timestamps: false });
const Task = sequelize.define('task', { name: DataTypes.STRING }, { timestamps: false });
const Tool = sequelize.define('tool', {
name: DataTypes.STRING,
size: DataTypes.STRING
}, { timestamps: false });
User.hasMany(Task);
Task.belongsTo(User);
User.hasMany(Tool, { as: 'Instruments' });
const tasks = await Task.findAll({ include: User });
findAll이든 findOne이든 위와 같이 include 속성을 이용해서 join 할 수 있다.
Task 테이블의 userId에 해당하는 User 테이블의 row를 가져온다.
[{
"name": "A Task",
"id": 1,
"userId": 1,
"user": {
"name": "John Doe",
"id": 1
}
}]
'Database > Sequelize' 카테고리의 다른 글
시퀄라이즈 모델 (Model Basics) (0) | 2020.05.22 |
---|---|
시퀄라이즈 시작 (Getting Started) (0) | 2020.05.22 |