我有下一个查询:
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 对结果链接进行排序,并且能够吸引用户。
答案 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
。