将PostgreSQL子查询语句转换为Sequelize查询

问题描述 投票:0回答:1

我有两个表:用户和出版物。用户具有管理员和订阅者等不同的角色。有一个User.hasMany(Publication)Publication.belongsTo(User)关联,允许管理员创建与他们的userId相关的出版物。

这是棘手的部分。我为每个用户提供了一系列subscribedPublications,其角色为“subscriber”。这样订阅者就可以随时访问其订阅中包含的出版物。

我想为订阅者构建一个查询,以访问其可用发布的索引及其相关列。我的问题是无法在Sequelize中为我的节点/快速应用程序执行此操作。以下是我能够在SQL中获得我想要的内容:

SELECT * 
FROM "Publications"
WHERE "id" IN (
  SELECT unnest("subscribedPublications") as "subscribedPublications"
  FROM "Users"
  WHERE "id"='f3fc2553-699c-49e0-8ad5-5a4692af1473'
);

这提供了一个表格,其中包含每个出版物的一行详细信息(因为我在这里unnest我的数组)。

请注意我在我的子查询中使用了特定的userId。我将通过req.params.id在我的授权订户的路线,所以我可以用它来检索他们的subscribedPublications集合。

到目前为止,我只是通过调用以下方式成功检索此特定用户的出版物:

return User.findById(id, {
  attributes: ['subscribedPublications']
})

但是,这并没有向我提供出版物的详细信息 - 只是出版物ID。

我也试过这个,没有成功:

const Sequelize = require("sequelize");
const sequelize = require("../../src/db/models/index").sequelize;
const Op = Sequelize.Op;
const Publication = require("./models").Publication;
const User = require("./models").User;

return Publication.findAll({
  where: {
    id: {
      [Op.in]: sequelize.query(
        '(SELECT unnest("subscribedPublications") as "subscribedPublications" FROM "Users" WHERE "id" = :id)',
        {replacements: {id: id}},
        { type: Sequelize.QueryTypes.SELECT}
      )
    }
  }
})
.then((publications) => {
  console.log(publications);
})
.catch((err) => {
  console.log(err);
})

我得到一个空白的[]结果。

其他说明:

  • 我不得不包括上面的续集定义,因为我得到了错误。
  • 为了简单起见,我刚刚为我的承诺添加了console.log
  • 我不知道Array类型是否会引起进一步的并发症。

TL; DR

需要创建一个Sequelize查询,它可以生成我可以从SQL子查询语句中获得的结果。我需要的列/字段是PostgreSQL中的Array类型 - 不知道是否需要在Sequelize中映射。

sql node.js postgresql sequelize.js
1个回答
0
投票

我设法通过使用sequelize.literal而不是sequelize.query +允许我的id参数通过感谢字符串连接来解决这个问题:

return Publication.findAll({
  attributes: ['id', 'title', 'fileLocation', 'tickerSymbol', 'recommendedPrice', 'createdAt', 'updatedAt'],
  where: {
    id: {
      [Op.in]: sequelize.literal(
        '(SELECT unnest("subscribedPublications") as "subscribedPublications" FROM "Users" WHERE "id" ='+ '\'' + id + '\')'
      )
    }
  }
})
.then((publications) => {
  console.log(publications);
})
.catch((err) => {
  console.log(err);
});
© www.soinside.com 2019 - 2024. All rights reserved.