首页 > 解决方案 > 使用 ANY 运算符将 SQL 查询转换为 Sequelize findAll 函数时出现问题

问题描述

我有三个表格:
1.post(postId(PK), postTitle, postDescription) 2.campaignId
(PK), platformId(FK), EffectiveFrom, EffectiveThrough, postArray: postId[])
// 这里 postArray 包含 postIds整数类型
3. 平台(platformId(PK), platformName)

我在 PostgreSQL 客户端上运行的查询是:

select posts.*, platforms.*, campaigns.campaignId, campaigns.platformId, campaigns.postArray
from campaigns
INNER JOIN platforms
ON campaigns.platformId = platforms.platformId
INNER JOIN posts
ON posts.postId = ANY(campaigns.postArray);

它返回以下输出:

postid  posttitle   postdescription platformid  platformname    campaignid  platformid  postarray
1       Post1       This is Post1       1       Facebook        1           1          {1,2,3}
2       Post2       This is Post2       1       Facebook        1           1          {1,2,3}
3       Post3       This is Post3       1       Facebook        1           1          {1,2,3}
2       Post2       This is Post2       1       Facebook        2           1          {2,4,5}
4       Post4       This is Post4       1       Facebook        2           1          {2,4,5}
5       Post5       This is Post5       1       Facebook        2           1          {2,4,5}
2       Post2       This is Post2       3       LinkedIn        3           3          {2,3,4,5}
...

现在我想在 Sequelize 中获得相同的输出,但不确定如何在 findAll 函数中使用“Any”运算符。

这是我的 findAll 代码:

exports.findAll = (req, res, next) => {
    Campaigns.findAll({
        include: [
            {
                model: Platform,
                required: true
            },
            {
                model: Post,
                required: true,
                [Op.any]: ['"postArray"']
            }
        ],
        order:[
            ['"campaignId"', 'ASC']
        ]
    })
    .then(campaign=> {
        res.status(200).json(campaign.sort(function(c1, c2){return c1.campaignId - c2.campaignId}));
    })
    .catch(err => {
        console.log(err);
        res.status(500).json({msg: "error", details: err});
    });
};

&这些是关系:

  db.campaigns.hasMany(db.posts,{sourceKey: 'postId', foreignKey: 'postArray'});
  db.campaigns.hasOne(db.platforms,{sourceKey: 'platformId', foreignKey: 'platformId'});

我知道我做错了,它不会运行。请建议我一个解决方案和更好的方法来解决我的问题。

标签: node.jspostgresqlsequelize.jsinner-join

解决方案


Sequelize 不支持通过数组的关系。使用 include 创建 JOIN 只支持 sequelize 中定义的关系,由于无法在 sequelize 中定义关系,所以不可能。


推荐阅读