orm - 使用多个表和别名构造 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对结果链接进行排序并能够获取用户。
解决方案
假设您已经像这样定义了模型:
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
。