Sequelize:join最大版本logging关联表?

在我的应用程序中,我有两个模型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; 

我正在处理的数据库只允许INSERT,所以我只能通过在userdetail插入一个新行来“更新”logging。

我在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()方法find最新的logging。 这是我遇到问题的地方。 我知道我需要join三次(User < – > UserDetail < – > UserDetail),所以我有以下几点:

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

但是,这给出的错误userdetail (userdetail2) is not associated to user! ,所以我不知道如何join同一个表两次?

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

你也应该做两次关联:

 User.hasMany(UserDetail.getModel(), { foreignKey: "user_id" }); User.hasMany(UserDetail.getModel(), { as: "userdetail2", foreignKey: "user_id" }); UserDetail.getModel().belongsTo(User, { foreignKey: "user_id" }); UserDetail.getModel().belongsTo(User, { as: "userdetail2", foreignKey: "user_id" }); 

如果有人正在寻找这个答案,我在这个GitHub问题上回答: https : //github.com/sequelize/sequelize/issues/8600

第一步是按照@Adam的build议两次声明一对多关联。

然后,查询将如下所示:

 db.user.findAll({ include: [ { model: db.userDetail, required: false, // forces left join duplicating: false // prevents sub-queries }, { model: db.userDetail, as: 'userdetail2', required: false, // forces left join duplicating: false, // prevents sub-queries on: { '$user.id$': { $col: 'user->userdetail2.userId' }, '$user->userdetail.version$': { $col: 'user->userdetail2.version' } } } ], where: { '$user->membership_2.id$': { $eq: null } } });