嵌套包含不显示第二个包含的数据

nested include is not showing data for second include

我正在尝试通过使用嵌套包含从 sequelize 中获取 2 个左外连接。但是,第一个 include 中的第二个 include 没有返回 table 的数据。

call.hasMany(session,{
    as: "sessions"
})
session.belongsTo(call,{
    foreignKey: "call_id",
    as: "call"  
})
session.hasMany(session_extra_data,{
    as: "sessionExtraData"
})
session_extra_data.belongsTo(session,{
    foreignKey: "session_id",
    as: "session"
})
call.findAll({
    limit: 5,   
    include: [{
        model: session,
        as: "sessions",
        indlude:[{
            model: session_extra_data,
            as: "sessionExtraData",
        }],
        required: false
    }],
}).then(data => {
    console.log("DATA", JSON.stringify(data));
})

调用模型

const call = sequelize.define('call', {
    id: {
        type: Sequelize.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true, 
        field: 'id'
    },
    version: {
        allowNull: false,
        type: Sequelize.BIGINT,
        field: 'version'
    },
    
    
},{
    freezeTableName:true,
    timestamps: false
});

会话模型

const session = sequelize.define('session', {
    id: {
        type: Sequelize.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true, 
        field: 'id'
    },
    version: {
        field: 'version',
        type: Sequelize.BIGINT,
        allowNull: false,
    },
    callId : {
        field: 'call_id',
        type: Sequelize.BIGINT,
        allowNull: false
    },
},{
    freezeTableName:true,
    timestamps: false
});

会话额外模型

const session_extra_data = sequelize.define('session_extra_data', {
    id: {
        type: Sequelize.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true, 
        field: 'id'
    },
    version: {
        field: 'version',
        type: Sequelize.BIGINT,
        allowNull: false,
    },
    tenantId: {
        field: 'tenant_id',
        type: Sequelize.STRING(255),
        allowNull: false,
    },
    sessionId : {
        field: 'session_id',
        type: Sequelize.BIGINT,
        allowNull: false
    },
},{
    freezeTableName:true,
    timestamps: false
});

我已将所有模型定义放入代码中。 你可以看到并告诉我我做错了什么。

会话中有外键 table 呼叫 ID 数据为 call_id Session id 的 session-extra-data table 数据中有外键为 session_id

这可能是因为在关联中定义了一些缺失的属性。因此,数据库中可能有多个列用作外键。试试这个:

call.hasMany(session,{
    as: "sessions",
    foreignKey: "call_id",
    sourceKey: "id"
})
session.belongsTo(call,{
    foreignKey: "call_id",
    targetKey: "id",
    as: "call"  
})
session.hasMany(session_extra_data,{
    as: "sessionExtraData",
    foreignKey: "session_id",
    sourceKey: "id"
})
session_extra_data.belongsTo(session,{
    foreignKey: "session_id",
    targetKey: "id",
    as: "session"
})
call.findAll({
    limit: 5,   
    include: [{
        model: session,
        as: "sessions",
        indlude:[{
            model: session_extra_data,
            as: "sessionExtraData",
        }],
        required: false
    }],
}).then(data => {
    console.log("DATA", JSON.stringify(data));
})

您可能还想检查您的数据库架构,以确保 sessionssession_extra_data 表中没有任何额外的外键列....如果

await sequelize.sync()

正在代码中的某个位置执行。

编辑sequelize 的模型定义中,尝试对外键执行以下操作:

const session = sequelize.define('session', {
    // ...
    callId : {
        field: 'call_id',
        type: Sequelize.BIGINT,
        allowNull: false,
        references: {
            model: call,
            key: 'id'
        }
    },
    // ...
}, {
    freezeTableName:true,
    timestamps: false
})

// ...

const session_extra_data = sequelize.define('session_extra_data', {
    // ...
    sessionId : {
        field: 'session_id',
        type: Sequelize.BIGINT,
        allowNull: false,
        references: {
            model: session,
            key: 'id'
        }
    },
    // ...
}, {
    freezeTableName:true,
    timestamps: false
})