• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

질문이요

19.10.19 17:52 작성 조회수 71

0

시퀄라이즈 association이 제가 이해한 개념이 맞는지 확인 부탁드려요. 

 post.js

db.Post.belongsToMany(db.User, { through'Like'as'Likers' }); 

user.js

db.User.belongsToMany(db.Post, { through'Like'as'Liked' });

Post 와 User는 N:M관계로 서로 이어주는 중간테이블 Like를 갖고 있다. 

그 Like 테이블 안에는, 기본적으로 Created_at, Updated_at 컬럼을 갖고있다.

그리고, 두개의 테이블의 아이디 PostId 와 UserId를 갖고있다.

post.js 에서 정의한 Liker는 UserId 를 뜻하고, 

user.js 에서 정의한 Liked는 PostId를 뜻한다. 

서로의 아이디를 가리키는 형국이다. 

Like 중간테이블에 값저장하기. 

const post = await db.Post.findOne({ where: { id: req.params.id }});
await post.addLiker(req.user.id);

post.addLiker(req.user.id); : 중간 테이블의 값을 넣어줌

Liker 이므로 UserId를 써주어야한다.

중간 테이블에는 , post 이부분에서 PostId 와 

req.user.id 이 부분에서 UserId가 채워진다. 

1. 지금 제가 맞게 이해한건가요? 

________________________________________

2.

[ Hashtag {

    dataValues:

     { id: 9,

       name: 'ww',

       updatedAt: 2019-10-19T07:11:33.896Z,

       createdAt: 2019-10-19T07:11:33.896Z },

    _previousDataValues:

     { name: 'ww',

       id: 9,

       createdAt: 2019-10-19T07:11:33.896Z,

       updatedAt: 2019-10-19T07:11:33.896Z },

    _changed:

     { name: false, id: false, createdAt: false, updatedAt: false },

    _modelOptions:

     { timestamps: true,

       validate: {},

       freezeTableName: false,

       underscored: false,

       paranoid: false,

       rejectOnEmpty: false,

       whereCollection: [Object],

       schema: null,

       schemaDelimiter: '',

       defaultScope: {},

       scopes: {},

       indexes: [],

       name: [Object],

       omitNull: false,

       charset: 'utf8mb4',

       collate: 'utf8mb4_general_ci',

       sequelize: [Sequelize],

       hooks: {} },

    _options:

     { isNewRecord: true,

       _schema: null,

       _schemaDelimiter: '',

       attributes: undefined,

       include: undefined,

       raw: undefined,

       silent: undefined },

    isNewRecord: false } ]

지금  윗 값이
result.map(r => r[0])

이거 인데요. 

await newPost.addHashtags(result.map(r => r[0]));

Hashtags 이니 아이디들 들어간 배열을 수용할 수있는건 알겠는데요..

newPost.addHashtags( ) 이 괄호안  부분에 id 들어있는 객체(윗 값처럼 여러개 섞였어도..)만 있으면, 자기가 알아서 id 만 골라서 갖고 가는건가요?? 

_________________________________________

3.

1:N 관계에서요 

post 와 image는 1:N 관계이잖아요

db.Image.belongsTo(db.Post);

Image가 post에게 belongsTo (===속함) 하니까,

Image 테이블에 postId라는 post를 가르키는 컬럼이 생기는걸 알 수 있는데요. 

add 함수 쓸때요, 

          if (Array.isArray(req.body.image)) {
            const images = await Promise.all(req.body.image.map((image=> {
              return db.Image.create({ srcimage });
            }));
            await newPost.addImages(images);

이렇게 되어 있던데요, 

newPost.addImages(images)

에서 도대체 괄호 안에 무엇을 써주어야 할지 헷갈리네요?

newPost 는 테이블이고 

Images 도 테이블인데, 

괄호안에, postId 값을 넣어줘야한게 아닌가요?

괄호에 무엇이 들어 가야하는지 헷갈리네요. 

1번과 다르게 

괄호 안에, 중간테이블의 Liker (UserId를 가르키는 ) 채우기 위해 req.user.id 넣어 주었는데요.. 

post.addLiker(req.user.id); : 중간 테이블의 값을 넣어줌

Liker 이므로 UserId를 써주어야한다.

중간 테이블에는 , post 이부분에서 PostId 와 

req.user.id 이 부분에서 UserId가 채워진다. 

여기에서도 의문인게, 

A.addB(___) 이면, A와 B 둘다 DB 테이블이여야한는데

Liker는 테이블이 아니지 않나요.. ???

아니면, 다대다 할때만, as를 이용해서 user 테이블을 Liker라 이름 붙이고 또 동시에, UserId라는 표현으로   해주는건가요?

___________________________________________

4. 

관계를 지으면 id 부분이 와서 다른테이블을 가르키잖아요. id 대신에 따로 지정한 것이  오게 할 수 도 있나요?

___________________________________________

답변 1

답변을 작성해보세요.

0

1. 넵. createdAt, updatedAt으로 camelCase입니다. 다대다 관계도 맞게 이해하셨습니다.

2. id를 직접 넣어주거나, 저렇게 다른 시퀄라이즈의 결과물을 넣으시면 됩니다.

3. 2번에서 답했듯, id를 직접 넣어주거나 다른 시퀄라이즈의 결과물을 넣으면 되기 때문에 images(이미지를 생성한 시퀄라이즈 결과물)을 넣은 것입니다.

Liker나 Liked도 테이블이라고 생각하시면 됩니다. as가 테이블의 별명이라고 생각하시고요.

4. 가능합니다. 다만 그 값이 고유한 key여야 합니다. id 대신에 다른걸 key로 지정할 수 있습니다.