使用多个表和别名构造sequelize查询

时间:2019-08-28 04:52:09

标签: orm sequelize.js

我有下一个查询:

SELECT ul.createdAt, ul.userId, l.url, l.caption FROM links AS l, userLinks AS ul WHERE ul.userId = 1 AND ul.linkId = l.id ORDER BY ul.createdAt DESC;

我尝试了多种方法将其转换为续集,但没有一种方法被证明是成功的。

现在,我有一个名为links的模型和另一个名为userLinks的模型,我已经阅读了sequelize的文档以及与此有关的其他一些线程,但无法使其正常工作。

我如何构建查询

Link.findAll({
    order: [[UserLink, 'createdAt', 'DESC']],
    attributes: ['caption', 'id', 'url'],
    limit: 15,
    include: [
        {
            model: UserLink,
            attributes: ['createdAt'],
            where: {
                userId,
                linkId: Sequelize.col('links.id')
            }
        },
        {
            model: User,
            attributes: ['id', 'name', 'about', 'username', 'picture']
        }
    ]
})

Link.belongsToMany(User, { through: UserLink });
User.belongsToMany(Link, { through: UserLink });

我遇到错误

SequelizeEagerLoadingError: user_link is not associated to link!

我意识到UserLink本身就是用户和链接之间的关联表,这就是为什么它没有关联的原因,但是我需要通过传递表的 createdAt 对结果链接进行排序,并且能够吸引用户。

1 个答案:

答案 0 :(得分:0)

假设您已经定义了这样的模型:

Link.hasMany(UserLinks, { foreignKey: 'link_id', as: 'userLinks' });
UserLink.belongsTo(Link, { foreignKey: 'link_id', as 'link' });

查询将是:

Link.findAll({
  attributes: ['caption', 'id', 'url'],
  order: [['userLinks', 'created_at', 'DESC']],
  limit: 15,
  include: [
    {
      model: UserLink,
      as: 'userLinks',
      attributes: ['created_at'],
      required: true,
      where: { userId }
    },
  ],
});

请注意,您应该使用require: true,否则Sequelize将建立LEFT JOIN