【发布时间】:2018-09-05 14:17:00
【问题描述】:
我有两个表:用户和出版物。用户具有不同的角色,例如管理员和订阅者。有一个User.hasMany(Publication) 和Publication.belongsTo(User) 关联,允许管理员创建与其userId 关联的出版物。
这是棘手的部分。对于每个角色为“订阅者”的用户,我都有一个 subscribedPublications 数组。这样订阅者就可以随时访问其订阅中包含的出版物。
我想为订阅者构建一个查询,以访问其可用出版物的索引及其相关列。我的问题是无法在 Sequelize 中为我的 node/express 应用程序执行此操作。以下是我如何在 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);
})
我得到一个空白的[] 作为结果。
其他说明:
- 我必须包含上述续集定义,因为我是 否则会出错。
- 为了简单起见,我刚刚为我的 Promise 添加了
console.log。 - 我不知道 Array 类型是否会导致进一步的复杂性。
TL;DR
需要创建一个 Sequelize 查询来产生我可以从 SQL 子查询语句中获得的结果。我需要的列/字段是 PostgreSQL 中的 Array 类型 - 不知道是否需要在 Sequelize 中映射。
【问题讨论】:
标签: sql node.js postgresql sequelize.js