관계형을 설정해줄때
아이디 <- > 게시글을 예로들면 아이디는 게시글 여러개를 가질 수 있다.
따라서 아이디의 입장에서는 hasMany(게시글)을 통해 관계를 지정해주고
게시글의 입장에서는 아이디에 속해있기때문에 belongsTo(아이디)를사용해서 지정해준다
models/user.js
const Sequelize = require("sequelize");
module.exports = class User extends Sequelize.Model {
// init 메서드 테이블에 대한 설정을 하고
// associate 메서드는 다른 모델과의 관계를 적습니다
static init(sequelize) {
return super.init(
{
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
},
age: {
type: Sequelize.INTEGER.UNSIGNED, //양수
},
comment: {
type: Sequelize.STRING(100),
allowNull: false,
},
},
{
sequelize, //해당 부분에 db.sequelize 객체가 들어간다.
timestamps: true, //true로 하면 createdAt과 updatedAt을 생성한다.
underscored: false, //기본적으로 테이블명과 컬럼명을 CamelCase로 바꾸는데 snake case로 변경해준다
modelName: "User", //모델 이름을 설정할 수있다
tableName: "User", //기본적으로 모델이름을 소문자및 복수형으로 만드는데 모델이 User면 users가된다
paranoid: false, // true로 설정하면 deletedAt 컬럼이 생긴다. 삭제시 완전히 지워지지 않고 deletedAt에 지운시각이 기록된다.
charset: "utf8mb4", //이모티콘까지 입력되게하려면 utf8mb4와 utf8mb4_general_ci오입력한다
collate: "utf8mb4_general_ci",
}
);
}
static associate(db) {
db.User.hasMany(db.Comment, { foreignKey: "commenter", sourceKey: "id" });
}
// VARCHAR STRING
// INT INTEGER
// TINYINT BOOLEAN
// DATETIME DATE
// NOT NULL allowNull: false
// UNIQUE unique:true
// DEFAULT now() defalutValue:Sequelize.NOW
};
models/comment.js
const Sequelize = require("sequelize");
const { static } = require("express");
const { associate } = require("./user");
module.exports = class Comment extends Sequelize.Model {
static int(sequelize) {
return super.init(
{
comment: {
type: Sequelize.STRING(100),
allowNull: false,
},
},
{
sequelize,
timestamps: true,
modelName: "Comment",
tableName: "comments",
paranoid: false,
charset: "utf8mb4",
collate: "utf8mb4_general_ci",
}
);
}
static associate(db) {
//users 테이블과 연동된 commenter 컬럼이 없다.
//
// 관계설정 User는 댓글을 여러개 가지고 있으므로 hasMany Comment 댓글은 그와 반대로 연관되어있다
db.Comment.belongsTo(db.User, { foreignKey: "commenter", targetKey: "id" });
}
};
models/index.js
const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./user');
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.User = User;
User.init(sequelize);
db.Comment = Comment;
Comment.init(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
server.js
const express = require("express");
const app = express();
const morgan = require("morgan");
const { sequelize } = require("./models");
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.set("view engine", "ejs");
app.use(morgan("dev"));
//false를 true로 할시 서버 실행시마다 테이블을 재생성한다.
sequelize.sync({force: false}).then(() => console.log("db접속 성공")).catch(err => console.log(err));
app.listen(8000, () => console.log("this server listening on 8000"));
관계형 설정이 완료되어 commenter이 추가되었다
1:N 관계 설정
1대 다 관계(EX) 유저(1) 가 게시글들(N)을 보유)
hasMany < - > belongsTo
1:1 관계 설정
hasOne < -> belongsTo
N:M 관계 설정
belongsToMany
(ex: 게시글은 여러개의 해시태그를 가진다. 해시태그는 여러개의 게시글을 가진다)
쇼핑몰에서 회원 < -> 주문 목록 <-> 상품
회원입장에서 주문 목록 을 여러개 가질수 있고
주문목록 기준에서 주문목록 하나에 상품이 여러개 있을수 있다
'Node.js > node sequelize' 카테고리의 다른 글
Node Sequelize ORM 다루기 - 외래키 생성하기, 관계형 설정하기 (1) | 2021.02.12 |
---|---|
Node Sequelize ORM 다루기 - DB 생성및 테이블 생성하기 (0) | 2021.02.11 |
node mysql sequelize(1) mysql 연동및 테이블 생성하기 (0) | 2020.08.22 |