嵌套包含不显示第二个包含的数据
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));
})
您可能还想检查您的数据库架构,以确保 sessions
和 session_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
})
我正在尝试通过使用嵌套包含从 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));
})
您可能还想检查您的数据库架构,以确保 sessions
和 session_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
})