sequelize 유사검색

Creating the dots·2021년 12월 8일
0

project-3-ShallWeHealth

목록 보기
18/26

테이블과 필드 설정

  • Post.hostId는 User.id를 참조함 (fk)
  • Post.guestId는 User.id를 참조함 (fk)
  • Post와 User 테이블을 각각 다음과 같이 join (별칭주의)
    • LEFT JOIN Users as hosts ON Post.hostId = hosts.id,
    • EFT JOIN Users as guests ON Post.guestId = guests.id
  • 그 결과, 새로 생긴 테이블에는 호스트의 닉네임(hostNickname)과 게스트의 닉네임(guestNickname) 필드가 있음

구현하려는 내용

  • 닉네임을 검색해서 게시물을 찾으려고 한다.
  • 이때, 검색하는 닉네임은 호스트 닉네임이거나 게스트 닉네임이다.
  • 검색하는 닉네임이 실제 닉네임과 일부만 일치하더라도 검색할 수 있다. (유사검색)

시도한 방법

방법(1) 최상위 where에서 새로운 필드명(hostNickname, guestNickname)으로 조건 (해결❌)

User 테이블을 두번 join 시킨 다음 새롭게 생성된 테이블에서 [Op.or]로 다음과 같이 닉네임을 조건을 만드려고 했다.

where: {
  [Op.or]: [
    {
      hostNickname: {
        [Op.substring]: nickname,
      },
      guestNickname: {
        [Op.substring]: nickname,
      },
    },
  ],
},

그 결과, 다음과 같은 에러가 발생했다. 에러에서는 Post테이블에는 hostNickname과 guestNickname이라는 필드가 존재하지 않는다고 설명한다.

두번의 조인을 통해 새롭게 만들어진 테이블에 hostNickname과 guestNickname이라는 필드가 있는 것이지, 기존의 Post 테이블에는 두개의 필드가 없는 것이다.

방법(2) 최상위 where에서 join한 테이블의 별칭과 필드명으로 조건 (해결✅)

두번의 조인을 할때, 각각 hosts(Post.hostId와 조인한 User 테이블의 별칭)와 guests(Post.guestId와 조인한 User 테이블의 별칭)라는 별칭을 사용했는데, where 조건에서 이 별칭을 사용해서 구분해주었다.

where: {
  [Op.or]: [
    {
      [`$guests.nickname$`]: {
        [Op.substring]: nickname, //여기서 Op.substring은 "%"+nickname+"%"와 같은 기능
      },
    },
    {
      [`$hosts.nickname$`]: {
        [Op.substring]: nickname,
      },
    },
  ],
},

reference

profile
어제보다 나은 오늘을 만드는 중

0개의 댓글