首页 > 解决方案 > 使用多个表和别名构造 sequelize 查询

问题描述

我有下一个查询:

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对结果链接进行排序并能够获取用户。

标签: ormsequelize.js

解决方案


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

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


推荐阅读