관리 메뉴

나의 개발일지(김지헌)

항해 99 58일차 11/15일 본문

항해 99

항해 99 58일차 11/15일

코딩이좋아요 2022. 11. 16. 01:38

오늘은 모델들의 관계 설정을 해주었다.

자바스크립트에서 관계 설정을 해줄때는 User <-> Post의 모델들이 있으면 서로 테이블에서 참조를 했었는데

더보기

 

       ---유저 모델---
 //포스트로 유저 아이디를 보낸다.
      this.hasMany(models.Post,{ sourceKey : "userId",foreignKey : "userId" })
      
      ---포스트 모델---
//포스트는 유저에서 보낸 유저아이디를 받아서 포링키로 보내준다
      this.belongsTo(models.User,{targetKey : "userId",foreignKey : "userId" })

이런식으로 모델 두개를 사용해서 관계 메소드를 사용했었고 타입스크립트에서도 똑같이 사용을 하니 처음에는 

"'User[]' 형식에 'userId' 속성이 없습니다.",  라는에러가 떳었고

수정을 하고 나니 hasmany called with something that's not a subclass of sequelize.model 라는 오류가 떳다 

관계 메서드를 두번 호출을 하게 해서 나오는 에러였다.

이유를 찾아보니 두개의 모델에서 사용하는것이 아닌 참조하는 모델에서 관계설정을 해줘야 하는것이였다.

더보기
import { Association, DataTypes, Model } from 'sequelize';
import Camp from './camp';
import sequelize from './sequlize';
import User from './user';

export class Pick extends Model {
  //? 조회 후 사용 되어질 요소들의 타입명시 설정이 되어 있지 않으면 조회시 또는 조회 후 데이터 타입체크에서 오류
  public readonly PickId!: number;
  public campId!: number;
  public userId!: number;
  //관계 타입
  public User!: User;
  public Camp!: Camp;
  
  //관계 설정
  public static associations: {
    Camp: Association<Camp>;
    Pick: Association<Pick>;
    User: Association<User>;
  };
}

//? 모델 생성
Pick.init(
  {
    pickId: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.MEDIUMINT,
    },
    campId: {
      allowNull: false,
      type: DataTypes.MEDIUMINT,
    },
    userId: {
      allowNull: false,
      type: DataTypes.MEDIUMINT,
    },
  },
  {
    sequelize, //? 생성한 Sequelize 객체 패싱
    modelName: 'Pick',
    tableName: 'pick',
    freezeTableName: true,
    timestamps: false,
  }
);
//두모델에서 사용한걸 하위모델에서 작성함
Camp.hasMany(Pick, {
  sourceKey: 'campId',
  foreignKey: 'campId',
  as: 'Pick',
});
Pick.belongsTo(Camp, {
  foreignKey: 'campId',
  as: 'Camp',
});
User.hasMany(Pick, {
  sourceKey: 'userId',
  foreignKey: 'userId',
  as: 'Pick',
});
Pick.belongsTo(User, {
  foreignKey: 'userId',
  as: 'User',
});

export default Pick;

이런식으로 두개의 모델에서 나누어서 보냈는 것을 하위 모델에서 사용해야 두번 호출 하는 에러를 잡을 수 있었다.

 

'항해 99' 카테고리의 다른 글

항해 99 60일차 11/17일  (0) 2022.11.18
항해 99 59일차 11/16일  (0) 2022.11.17
항해 99 57일차 11/14일  (0) 2022.11.15
항해 99 56일차 11/13일  (0) 2022.11.14
항해 99 55일차 11/12일  (0) 2022.11.13