PK를 가진 테이블과, FK를 가진 테이블을 생성한다.
**//1이 되는 테이블: hasMany 사용**
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class Plant extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
**static associate(models) {
// define association here
this.hasMany(models.Plant_category);
}**
}
Plant.init(
{
name: DataTypes.STRING(50),
image: DataTypes.STRING(2083),
description: DataTypes.STRING(500),
},
{
sequelize,
modelName: "Plant",
}
);
return Plant;
};
**//다가 되는 테이블: 별도로 static associate(models) 작성 필요하지 않다.**
다음 명령어로 새로운 마이그레이션 파일을 만든다
npx sequelize migration:generate --name 마이그레이션_파일이름
현재 다가 되는 테이블에서는 외래키를 지정해줄 칼럼이 없기 때문에 이를 추가해준다. 따라서 다음과 같이 적용할 수 있다.
"use strict";
module.exports = {
async **up**(queryInterface, Sequelize) {
await queryInterface.addColumn("다가 되는 테이블", "외래키 역할을 할 필드", {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: "외래키가 참조하는 테이블"(Plants),
key: "외래키가 참조하는 테이블의 필드명"(id),
},
//아래 두 속성은 부모 테이블의 레코드 삭제/업데이트 시,
//자식 테이블에서 관련된 레코드도 같이 삭제/업데이트 되도록 한다.
onUpdate: "CASCADE",
onDelete: "CASCADE",
});
},
//마이그레이션 취소 시에는 필드 삭제함
async **down**(queryInterface, Sequelize) {
await queryInterface.removeColumn("Plant_categories", "PlantId");
},
};
**//**Plant **테이블 정의하기**
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class Plant extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
this.hasMany(models.Plant_category);
**this.belongsToMany(models.User, { through: "Interiors" });**
}
}
Plant.init(
{
name: DataTypes.STRING(50),
image: DataTypes.STRING(2083),
description: DataTypes.STRING(500),
},
{
sequelize,
modelName: "Plant",
}
);
return Plant;
};
**//User 테이블 정의하기**
"use strict";
const { Model } = require("sequelize");
module.exports = (sequelize, DataTypes) => {
class User extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
**static associate(models) {
// define association here
this.belongsToMany(models.Plant, { through: "Interiors" });
}**
}
User.init(
{
email: DataTypes.STRING(50),
password: DataTypes.STRING(70),
nickname: DataTypes.STRING(10),
},
{
sequelize,
modelName: "User",
}
);
return User;
};
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable("Interiors", {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
**userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: "Users",
key: "id",
},
onUpdate: "CASCADE",
onDelete: "CASCADE",
},
plantId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: "Plants",
key: "id",
},
onUpdate: "CASCADE",
onDelete: "CASCADE",
},**
image: {
allowNull: false,
type: Sequelize.STRING(2083),
},
content: {
allowNull: false,
type: Sequelize.STRING(1000),
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable("Interiors");
},
};
https://medium.com/@andrewoons/how-to-define-sequelize-associations-using-migrations-de4333bf75a7