• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

시퀄라이즈 코드 질문드립니다.

20.12.21 13:50 작성 조회수 419

0

안녕하세요. 맨날 시퀄라이즈 질문만 드리게 되어 죄송합니다.ㅠㅠ

다름이 아니고,

좋아요 순으로 노드버드의 게시물을 정렬하는 GET 메소드를 만들고 싶은데요.

이런 식으로 쿼리를 짜보았습니다. (적절한지 평가해주시면 감사하겠습니다)

이 알고리즘을 시퀄라이즈 findAll로 표현하고 싶은데, 잘 안됩니다ㅠㅠ

게시물들을 좋아요 순서로 정렬하는 방법도 알려주심 안될까요..?

답변 6

·

답변을 작성해보세요.

0

김동현님의 프로필

김동현

질문자

2020.12.24

콘솔 쿼리 보면서 해결했습니다 감사합니다!!

      order: [[sequelize.literal("(COUNT(`likers->like`.`PostId`))"), "DESC"]],

이렇게 하니까 되네요.

0

저기 객체 안에 Likers는 시퀄라이즈가 만들어주는 객체이고요. 실제 DB와는 다릅니다. COUNT(`Likers`.`id`) 이런 식으로 DB에 적혀있는 테이블명과 컬럼명을 구분해야 할 것 같네요(``가 테이블과 컬럼을 구분해줍니다) sequelize.literal을 쓰기 시작할 때부터는 SQL문법을 어느정도 그대로 쓰셔야 합니다. 그리고 시퀄라이즈 쿼리를 할 때 콘솔에 나오는 쿼리를 분석해보는 것도 좋습니다. 그걸 기반으로 바꿔야하거든요.

0

김동현님의 프로필

김동현

질문자

2020.12.23

      order: [[sequelize.literal('COUNT(Likers.id)'), 'DESC']],
SequelizeDatabaseError: Unknown column 'Likers.id' in 'order clause'
    at Query.formatError (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/mysql/query.js:239:16)
    at Query.run (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/mysql/query.js:54:18)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async /Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/sequelize.js:619:16
    at async MySQLQueryInterface.select (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/dialects/abstract/query-interface.js:938:12)
    at async Function.findAll (/Users/donghyun/Documents/react-sns/back/node_modules/sequelize/lib/model.js:1753:21)
    at async /Users/donghyun/Documents/react-sns/back/routes/posts.js:45:19

order 문을 사용했더니 위 에러가 발생합니다.  Likers.id가 왜 알 수 없는 컬럼이라고 나올까요..

Post 객체의 구조는 다음과 같습니다.

Post 안에 Likers가 분명 있는데요..ㅠㅠ

0

sequelize.literal을 안 쓰고는 COUNT같은 것을 처리하기는 어렵습니다. 에러가 나면 무슨 에러가 나는지 알려주세요.

0

김동현님의 프로필

김동현

질문자

2020.12.23

감사합니다!

근데 ORDER BY 이전까지 시퀄라이즈로 표현하는게 되게 힘드네요ㅠㅠㅠ

sequelize.literal를 쓰지 않고

단순히 Post 객체 내부에 있는 Likers의 length로 정렬할 수 있는 방법은 없을까용..?

const posts = await Post.findAll({
      where,
      limit: 10,
      order: [[sequelize.literal('COUNT(Likers.id)'), 'DESC']],
      include: [
      {
        model: User, // 좋아요 누른 사람
        as: 'Likers',
        attributes: ['id'],
      },
      ],
    });

저런 의미의 order문이 들어가면 될 것 같은데 오류가 나네요..........

0

order: [[sequelize.literal('COUNT(likes.PostId)'), 'DESC']]

이거 쓰시면 됩니다.