在我的应用程序中,我有两个模型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中插入新行来“更新”记录。

我在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()方法查找最新记录。这就是我遇到问题的地方。我知道我需要加入3次(用户 UserDetail UserDetail),所以我有以下内容:
return this.model.findAll({
    include: [{
    model: this.UserDetail.getModel()
}, {
    model: this.UserDetail.getModel(),
    as: "userdetail2"
}]

但是,这给出了错误userdetail (userdetail2) is not associated to user!,所以我不确定如何两次将同一张表连接起来?

此外,我需要第二个联接在其userdetail.version子句中对ON设置条件-在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"
});

10-07 12:18