강의

멘토링

커뮤니티

Inflearn Community Q&A

admin0038's profile image
admin0038

asked

[Renewed] Node.js Textbook - From Basics to Project Practice

sequlize 관계 쿼리에서 get**, add** 등 추가로 사용할 수 있는 함수들이 not a function이 뜹니다.

Written on

·

284

0

강의를 통해 짜고 있는 프로젝트에 content와 content_category를 있는 구조라 N:M 구조로 짜고 있습니다.

강의에서 hashTag와 post와 같이 N:M 구조로 belongsToMany의 구조로 되어 있습니다.

그래서 content 모델에는 다음과 같이 되어 있고

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'as : 'content_category_idk'foreignKey : 'content_category_idk'}
           )

content_category에서는

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'as : 'content_idk'foreignKey : 'content_idk'}
           )

다음과 같이 연결되어 있습니다.

하지만, 아래와 같이 belongsToMany 등 관계 커리에서 사용할 수 있는 get**, add** 등의 함수를 사용하고자 했을 때,

와 같이 not is function이 뜹니다.

그래서 ContentCategorys, ContentCategories 등 바꿔봐도 똑같습니다. 왜 그런가요?

nodejsmysqlmongodbSequelize

Answer 2

1

zerocho님의 프로필 이미지
zerocho
Instructor

as를 잘못 쓰셨습니다. 저 이름은 as 따라갑니다. getContent_idk 이런 것으로 생성되었을 겁니다. as는 키 이름이 아니라 모델의 별명입니다. 그리고 foreignKey의 대상과 반대로 작성하셔야 합니다.

admin님의 프로필 이미지
admin
Questioner

답변 감사합니다. 그리고 말씀하신 것과 같이 변경했습니다. foreignKey는 헷갈렸던 것 같습니다. 

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'}
            )
       }

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'}
           )

위와 같이 변경 이후에도 죄송하지만

const test = await Content.getContentCategory()

해당 함수가 not function이 뜹니다.

zerocho님의 프로필 이미지
zerocho
Instructor

테이블 지웠다가 다시 생성하시고, as 지정해주세요. as의 이름대로 갑니다.

admin님의 프로필 이미지
admin
Questioner

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'as : 'Content'}
           )

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'as : 'ContentCategory'}
           )

as도 다 지정했었고, 아래와 같이 했었습니다.

const test = await Content.getContentCategory()

테이블도 한번 지우고 새로 생성하여 진행중입니다.

zerocho님의 프로필 이미지
zerocho
Instructor

as랑 foreignKey랑 반대 관계여야 합니다. as 두 개를 서로 바꾸세요.

admin님의 프로필 이미지
admin
Questioner

const test = await Content.getContentCategory()

혹시 죄송하지만 이거 아닌가요..? 계속 not function이라고 뜨는데,, 

말씀 해주신대로 as 수정 한 뒤, 테이블  한번더 새로 생성해서 진행했습니다.

db.ContentCategory.belongsToMany(db.Content
            {through : 'content_category_join'foreignKey : 'content_category_idk'as : 'Content'}
           )

db.Content.belongsToMany(db.ContentCategory
            {through : 'content_category_join'foreignKey : 'content_idk'as : 'ContentCategory'}
           )
zerocho님의 프로필 이미지
zerocho
Instructor

getContentCategories() 일 수도 있습니다.
console.log(Content.getContent, Content.getContents, Content.getContentCategory, Content.getContentCategories) 해서 어떤 메서드가 있나 보세요.

admin님의 프로필 이미지
admin
Questioner

[]

메서드가 없다고 뜹니다..

admin님의 프로필 이미지
admin
Questioner

네개 모두 undefined이 뜹니다.. 뭔가 혹시나 해서 getContentCategorys도 해봤습니다만 undefinded가 뜹니다. 혹시 셋팅을 따로 해야하는게 있나요..?

zerocho님의 프로필 이미지
zerocho
Instructor

지금 db에 Content, ContentCategory, content_category_join 테이블 세 개 모두 있죠? 처음 서버 실행 시 content_category_join을 만드는 sql을 봐야할 것 같습니다.

admin님의 프로필 이미지
admin
Questioner

content 와 content_category로 생성하기 위해

modelName: 'ContentCategory',
tableName: 'content_category',

아래와 같이 셋팅하여

content, content_category로 생성 됐습니다.

아래가 content_category_join를 만드는 sql 입니다.

CREATE TABLE IF NOT EXISTS `content_category_join` (`created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `content_idk` INTEGER , `content_category_idk` INTEGER , PRIMARY KEY (`content_idk`, `content_category_idk`), FOREIGN KEY (`content_idk`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`content_category_idk`) REFERENCES `content_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

0

admin님의 프로필 이미지
admin
Questioner

content 와 content_category로 생성하기 위해

modelName: 'ContentCategory',
tableName: 'content_category',

아래와 같이 셋팅하여

content, content_category로 생성 됐습니다.

아래가 content_category_join를 만드는 sql 입니다.

CREATE TABLE IF NOT EXISTS `content_category_join` (`created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, `content_idk` INTEGER , `content_category_idk` INTEGER , PRIMARY KEY (`content_idk`, `content_category_idk`), FOREIGN KEY (`content_idk`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`content_category_idk`) REFERENCES `content_category` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

admin님의 프로필 이미지
admin
Questioner

contents 생성 sql

CREATE TABLE IF NOT EXISTS `contents` (`id` INTEGER NOT NULL auto_increment , `pd_idk` INTEGER(11) NOT NULL, `state` TINYINT NOT NULL, `img1` VARCHAR(255) NOT NULL, `img2` VARCHAR(255), `img3` VARCHAR(255), `img4` VARCHAR(255), `img5` VARCHAR(255), `img6` VARCHAR(255), `satisfaction` TINYINT NOT NULL, `review_txt1` VARCHAR(255), `review_txt2` VARCHAR(255), `review_txt3` VARCHAR(255), `review_txt4` VARCHAR(255), `review_comment` VARCHAR(500) NOT NULL, `user_id` VARCHAR(45) NOT NULL, `order_product_idk` INTEGER(11) NOT NULL, `height` INTEGER(11) NOT NULL, `size` INTEGER(11) NOT NULL, `is_size_public` TINYINT NOT NULL, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pd_idk`) REFERENCES `products` (`product_pk`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (`order_product_idk`) REFERENCES `order_product` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

content_category 생성 sql

CREATE TABLE IF NOT EXISTS `content_category` (`id` INTEGER NOT NULL auto_increment , `name` VARCHAR(45) NOT NULL UNIQUE, `created_at` DATETIME NOT NULL, `updated_at` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

혹시나 해서 관련 table 생성 sql도 같이 공유 해드립니다.. 답변 주셔서 늘 감사드립니다.

zerocho님의 프로필 이미지
zerocho
Instructor

https://stackoverflow.com/questions/49467654/what-methods-mixins-sequelize-adds-to-the-models-when-an-association-is-made

위 글 참고해서 어떤 메서드들이 있는지 찍어보세요.

admin0038's profile image
admin0038

asked

Ask a question