Node.js 在Sequelize中创建关联以进行左连接
我想使用Sequelize做一个左连接,它的作用与此SQL代码相同Node.js 在Sequelize中创建关联以进行左连接,node.js,postgresql,sequelize.js,Node.js,Postgresql,Sequelize.js,我想使用Sequelize做一个左连接,它的作用与此SQL代码相同 SELECT*FROM events LEFT JOIN zones ON event_tz=zid,其中event_creator_fk=116 我有两个表:事件和区域(带有时区列表) 当查询由特定用户创建的所有事件时,我还希望获得时区的名称和有关TZ的其他详细信息 我已经尝试了多种解决方案的组合,尽可能地查看示例代码、其他堆栈溢出问题和文档。查询始终有效,但不执行任何连接。也就是说,下面的代码总是返回事件列表,但是zones
SELECT*FROM events LEFT JOIN zones ON event_tz=zid,其中event_creator_fk=116代码>
我有两个表:事件
和区域
(带有时区列表)
当查询由特定用户创建的所有事件时,我还希望获得时区的名称和有关TZ的其他详细信息
我已经尝试了多种解决方案的组合,尽可能地查看示例代码、其他堆栈溢出问题和文档。查询始终有效,但不执行任何连接。也就是说,下面的代码总是返回事件列表,但是zones
表中没有时区数据。生成的SQL是正确的,只是它在event_tz=zid…
部分没有…左连接区域
下面的代码是错误的。有关详细信息,请参见答案
如果我理解正确,在sequelize中添加表之间的关联会导致自动创建额外的列。这不是我想做的。我不希望Sequelize以任何方式修改表或数据库。我想设置我的数据库和它的表没有续集。因此,我没有调用sequelize.sync()
。我不知道是否有办法按照我想要的方式建立关联
模型定义
module.exports = function (sequelize, DataTypes) {
var Event = sequelize.define('Event', {
eid: {
type: DataTypes.INTEGER,
primaryKey: true
},
event_tz: {
type: DataTypes.INTEGER,
primaryKey: true,
references: "Zone",
referencesKey: "zid"
},
}, {
classMethods: {
associate: function (models) {
return models.Event.hasOne(models.Zone);
}
},
freezeTableName: true,
timestamps: false,
tableName: 'events'
}
);
return Event;
};
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Zone', {
zid: {
type: DataTypes.INTEGER,
primaryKey: true
}
}, {
classMethods: {
associate: function (models) {
return models.Zone.belongsTo(models.Event);
}
},
freezeTableName: true,
timestamps: false,
tableName: 'zones'
});
};
DROP TABLE IF EXISTS zones;
CREATE TABLE IF NOT EXISTS zones (
zid integer NOT NULL,
country_code character(2) NOT NULL,
zone_name text NOT NULL,
PRIMARY KEY (zid)
);
DROP TABLE IF EXISTS events;
CREATE TABLE IF NOT EXISTS events (
eid BIGSERIAL NOT NULL,
event_tz SERIAL NOT NULL,
PRIMARY KEY (eid),
FOREIGN KEY (event_tz)
REFERENCES zones(zid) MATCH FULL ON DELETE RESTRICT
);
表格定义
module.exports = function (sequelize, DataTypes) {
var Event = sequelize.define('Event', {
eid: {
type: DataTypes.INTEGER,
primaryKey: true
},
event_tz: {
type: DataTypes.INTEGER,
primaryKey: true,
references: "Zone",
referencesKey: "zid"
},
}, {
classMethods: {
associate: function (models) {
return models.Event.hasOne(models.Zone);
}
},
freezeTableName: true,
timestamps: false,
tableName: 'events'
}
);
return Event;
};
module.exports = function (sequelize, DataTypes) {
return sequelize.define('Zone', {
zid: {
type: DataTypes.INTEGER,
primaryKey: true
}
}, {
classMethods: {
associate: function (models) {
return models.Zone.belongsTo(models.Event);
}
},
freezeTableName: true,
timestamps: false,
tableName: 'zones'
});
};
DROP TABLE IF EXISTS zones;
CREATE TABLE IF NOT EXISTS zones (
zid integer NOT NULL,
country_code character(2) NOT NULL,
zone_name text NOT NULL,
PRIMARY KEY (zid)
);
DROP TABLE IF EXISTS events;
CREATE TABLE IF NOT EXISTS events (
eid BIGSERIAL NOT NULL,
event_tz SERIAL NOT NULL,
PRIMARY KEY (eid),
FOREIGN KEY (event_tz)
REFERENCES zones(zid) MATCH FULL ON DELETE RESTRICT
);
您需要反转关联并告诉sequelize您的外键。belongsTo表示“将fk添加到此模型中”:
models.Event.belongsTo(models.Zone, { foreignKey: 'event_tz');
models.Zone.hasOne(models.Event, { foreignKey: 'event_tz');
// or hasMany if this is 1:m
问题的一部分是我错误地使用了findAll
方法。查询选项where
和include
应作为同一对象的一部分包含。findAll
的第一个参数是一个选项参数。有关更多详细信息,请参阅。正确的代码应该如下所示
db.Event.findAll(
{
where: { event_creator_fk: someUserID },
include: [{ model: db.Zone } ]
},
);
谢谢你的回复。我用.hasOne
和.hasMany
尝试了您的解决方案,但仍然不起作用。我没有收到任何错误,返回了事件表的结果,但我仍然得到了区域ID。我是否需要上述模型定义中指定的代码:引用:“区域”,引用密钥:“zid”
。我不明白的是:是否需要调用sequelize.sync()
。我不希望sequelize修改我的表。您不需要调用sequelize.sync-这仅在您不希望sequelize创建表时才需要。如果您的模型仍有zoneId列,则必须正确指定外键