首页 文章

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

提问于
浏览
1

我想使用与此SQL代码相同的Sequelize进行左连接 .

SELECT * FROM events LEFT JOIN zones ON event_tz=zid WHERE event_creator_fk=116;

我有两个表: eventszones (带有时区列表) .

查询特定用户创建的所有事件时,我还想获取时区名称和TZ的其他详细信息 .

我已经通过查看示例代码,其他Stack Overflow问题和尽可能多的文档尝试了许多解决方案组合 . 查询始终有效,但不进行任何连接 . 也就是说,它下面的代码总是返回事件列表,但没有来自 zones 表的时区数据 . 生成的SQL是正确的,除了它没有 ...LEFT JOIN zones ON event_tz=zid... 部分 .

以下代码是错误的 . 查看答案了解详情 .

db.Event.findAll(
    { where: { event_creator_fk: someUserID } },
    { include: [{ model: db.Zone } ]}
);

如果我理解正确,在sequelize中添加表之间的关联会导致自动创建一个额外的列 . 这不是我想要做的 . 我不希望Sequelize以任何方式修改表或数据库 . 我想设置我的数据库和没有Sequelize的表 . 因此,我没有打电话给 sequelize.sync() . 我不知道是否有以我想要的方式设置关联 .

Model Definitions

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

Table Definitions

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

2 回答

  • 1

    您需要反转关联并告诉您关于外键的续集 . 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
    
  • 0

    部分问题是我错误地使用了 findAll 方法 . 查询选项 whereinclude 应该作为同一对象的一部分包含在内 . findAll 的第一个参数是options参数 . 有关详细信息,请参阅here . 正确的代码应如下所示 .

    db.Event.findAll(
        {
             where: { event_creator_fk: someUserID },
             include: [{ model: db.Zone } ]
        },
    );
    

相关问题