【问题标题】:nested include is not showing data for second include嵌套包含未显示第二个包含的数据
【发布时间】:2021-11-02 09:37:47
【问题描述】:

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

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
});

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

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

【问题讨论】:

  • 您能否包括callsessionsession_extra_data 模型的sequelize 模型定义? as 属性有很多别名,如果没有 sequelize.define(...) 或 'call.init(...)` 定义,很难判断会发生什么...

标签: sequelize.js


【解决方案1】:

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

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
})

【讨论】:

  • 我试过你的方法,但还是不行。除了 "call_id" 和 session_extra_data 除了 "session_id" 之外,会话中没有额外的外键
  • 我已经把模型定义请检查
  • @Tayyab 我在答案中添加了关于模型定义的建议。另外,您是否能够检查数据库以查看您是否碰巧在sessionsession_extra_data 表中有任何额外的列?
  • 太好了,谢谢伙计。你拯救了我的一天。有用。非常感谢@Andrew :) :)
猜你喜欢
  • 2016-04-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多