본문 바로가기

Node.js/node sequelize

node mysql sequelize(2) 연관 관계 설정하기

 

 

 

 

 

관계형을 설정해줄때 

아이디 <- > 게시글을 예로들면 아이디는 게시글 여러개를 가질 수 있다.

따라서 아이디의 입장에서는 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: 게시글은 여러개의 해시태그를 가진다. 해시태그는 여러개의 게시글을 가진다)

쇼핑몰에서 회원  < -> 주문 목록 <-> 상품

 

회원입장에서 주문 목록 을 여러개 가질수 있고

 

주문목록 기준에서 주문목록 하나에 상품이 여러개 있을수 있다