Перевести SQL в Knex - PullRequest
       10

Перевести SQL в Knex

0 голосов
/ 02 ноября 2019

Я использую knex и возражения для создания API. Я пытаюсь перевести SQL ниже в knex без использования raw, чтобы я мог получить все сообщения, связанные со списком групп и других пользователей. Данные распределены по 4 группам таблиц, сообщениям, голосам и друзьям.

select posts.*, sum(voted.vote), users.full_name
        from  users, posts left outer join voted
        on posts.id = voted.post_id
        where(users.id = posts.user_id and posts.group_id = ${group_id})
        group by posts.id, voted.post_id, users.full_name;`);
console.log(post.rows[0], 'post from rows

1 Ответ

0 голосов
/ 02 ноября 2019

У вас все в порядке: в этом SQL нет ничего необычного, и все можно представить с помощью API Knex. Однако имеет смысл выразить неявное объединение:

FROM users, posts

как явное объединение:

FROM users
JOIN posts ON users.id = posts.user_id

, означающее, что вы можете отбросить первую часть вашего предложения WHERE. Это будет выглядеть примерно так:

knex
  .select("posts.*", "users.full_name")
  .sum("voted.vote")
  .from("users")
  .join("posts", "posts.user_id", "users.id")
  .leftOuterJoin("voted", "posts.id", "voted.post_id")
  .where("posts.group_id", groupId)
  .groupBy("posts.id")
  .groupBy("voted.post_id")
  .groupBy("users.full_name")

Это приводит к выводу SQL:

'select "posts".*, "users"."full_name", sum("votes"."vote") from "users" ' +
    'inner join "posts" on "posts"."user_id" = "users"."id" left outer ' +
    'join "voted" on "posts"."id" = "voted"."post_id" where ' +
    '"posts"."group_id" = ? group by "posts"."id", "voted"."post_id", ' +
    '"users"."name"'

Вы также можете обнаружить, что некоторые из ваших GROUP BY не нужны, нопосмотрим, как вы ладите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...