Node.js 在Sequelize中创建关联以进行左连接

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

我想使用Sequelize做一个左连接,它的作用与此SQL代码相同

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列,则必须正确指定外键