我有两个表:User和Publications。用户具有不同的角色,例如管理员和订户。有User.hasMany(Publication)
和Publication.belongsTo(User)
关联,允许管理员创建与其userId
关联的发布。
这是棘手的部分。对于具有“订阅者”角色的每个用户,我都有一个 subscribedPublications数组。这样一来,订阅者就可以始终访问其订阅中包含的出版物。
我想为订户建立一个查询,以访问其可用出版物及其相关列的索引。我的问题是无法在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
。需要创建一个Sequelize查询,该查询产生的结果可以从SQL子查询语句获得。我需要的列/字段在PostgreSQL中为Array类型-不知道是否需要在Sequelize中进行映射。
答案 0 :(得分: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);
});