gpt4 book ai didi

node.js - Sequelize : Joining a max version record associated table?

转载 作者:行者123 更新时间:2023-12-02 12:15:57 24 4
gpt4 key购买 nike

在我的应用程序中,我有两个模型 useruserdetailuser 详细信息只是一个包含唯一 ID 的表,并且 userdetail(user_id, version) 上有一个唯一的键。当我想要获取最新的用户数据时,我运行类似于以下的 SQL:

SELECT userdetail1.password_hash FROM user
JOIN userdetail userdetail1 ON userdetail1.user_id = user.id
JOIN (
SELECT user_id, MAX(version) version
FROM userdetail
GROUP BY user_id
) userdetail2 ON userdetail2.user_id = userdetail1.user_id AND userdetail2.version = userdetail1.version
WHERE user.id = 1;

我正在处理的数据库只允许插入,因此我只能通过将新行插入userdetail来“更新”记录。

我在 Sequelize 中定义了两个模型:

var UserDetail = sequelize.define('userdetail', {
id: {
type: DataTypes.INTEGER(10),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
user_id: {
type: DataTypes.INTEGER(10),
allowNull: false,
references: {
model: 'user',
key: 'id'
}
},
version: {
type: DataTypes.INTEGER(10),
allowNull: false
},
password_hash: {
type: DataTypes.STRING,
allowNull: false
}
}, {
timestamps: false,
tableName: 'userdetail'
});
var User = sequelize.define('user', {
id: {
type: DataTypes.INTEGER(10),
allowNull: false,
primaryKey: true,
autoIncrement: true
},
created: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW
}
}, {
timestamps: false,
tableName: 'user'
});
User.hasMany(UserDetail.getModel(), {
foreignKey: "user_id"
});
UserDetail.getModel().belongsTo(User, {
foreignKey: "user_id"
});

我希望使用 findAll() 方法查找最新记录。这就是我遇到问题的地方。我知道我需要加入三次(User <-> UserDetail <-> UserDetail),所以我有以下内容:

return this.model.findAll({
include: [{
model: this.UserDetail.getModel()
}, {
model: this.UserDetail.getModel(),
as: "userdetail2"
}]

但是,这会给出错误userdetail (userdetail2) is not linked to user!,所以我不确定如何两次加入同一个表?

此外,我需要第二个连接在其 ON 子句中的 userdetail.version 上有一个条件 - 这在 Sequelize 中可能吗?

最佳答案

上述答案的另一个变体:

在文字语句中合并 这是使用 T-SQL。这个想法是,您只加入版本字段的最大结果。

db.user.findAll({
include: [
{
model: db.userDetail,
as: 'userdetail_a',
where: {
userId: userId,
[Op.and]: [ Sequelize.literal(' version = (
Select MAX(version)
FROM tbluserDetail
WHERE
userId = [user].[userId])')
],
}
}
],
});

即使有很多关联,您也必须将“userdetail_a”的关联设置为 hasOne,否则您的连接最终会成为数组中的一个值

关于node.js - Sequelize : Joining a max version record associated table?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com