javascript - 如何使用带有 sequelize.js 的 hasOne 引用两个表

标签 javascript node.js postgresql sequelize.js

考虑到 sequelize-auto 生成的这 3 个模型:

sequelize.define('users', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        first: {
            type: DataTypes.STRING,
            allowNull: true
        },
        last: {
            type: DataTypes.STRING,
            allowNull: true
        }
    }, {
        tableName: 'users',
        underscored: true,
        timestamps: false
    });

sequelize.define('groups', {
        id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            autoIncrement: true
        },
        parent_id: {
            type: DataTypes.INTEGER,
            allowNull: true,
            references: {
                model: 'groups',
                key: 'id'
            }
        }
    }, {
        tableName: 'groups',
        underscored: true,
        timestamps: false
});

sequelize.define('user_groups', {
        group_id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            primaryKey: true,
            references: {
                model: 'groups',
                key: 'id'
            }
        },
        user_id: {
            type: DataTypes.INTEGER,
            allowNull: false,
            references: {
                model: 'users',
                key: 'id'
            }
        }
    }, {
        tableName: 'user_groups',
        underscored: true,
        timestamps: false
    });

我期待生成 hasOne 语句,但我必须像这样指定它们:
user_groups.hasOne(orm.models.users, { foreignKey: "id" });
user_groups.hasOne(orm.models.groups, { foreignKey: "id" });

还要考虑表中的以下数据:
users (id, first, last):
1, John, Doe

group (id, parent_id):
1, NULL
2, NULL
3, NULL
4, NULL

user_groups (group_id, user_id):
1, 1
4, 1

做这个查询:
sequelize.findAll("user_groups", {
    attributes: ["*"],
    raw: true,
    include: [{
        model: models.users,
    }]
});

我得到以下结果:
[ { group_id: 4,
    user_id: 1,
    'user.id': null,
    'user.first': null,
    'user.last': null },
  { group_id: 1,
    user_id: 1,
    'user.id': 1,
    'user.first': 'John',
    'user.last': 'Doe' } ]

这清楚地表明 sequelize 使用 group_id 作为 user_id 关系。

如何指定将 user_groups 关系链接到各自表的关系,以便能够将用户与多个组相关联?

我也很好奇模型定义中的“引用”键应该如何工作,因为文档不存在。

最佳答案

我能够使用这些关联获取引用的数据:

groups.hasMany(orm.models.user_groups);
user_groups.belongsTo(orm.models.groups, {foreignKey: "group_id", as: "group"});

users.hasMany(orm.models.user_groups);
user_groups.belongsTo(orm.models.users, {foreignKey: "user_id", as: "user"});

以及以下查询:
sequelize.findAll("user_groups", {
    attributes: ["*"],
    raw: true,
    include: [
        { model: users, foreignKey: "user_id", as: "user", attributes: ["first", "last"] }
    ]
});

与预期的结果:
[ { group_id: 4,
    user_id: 1,
    'user.first': 'John',
    'user.last': 'Doe' },
  { group_id: 1,
    user_id: 1,
    'user.first': 'John',
    'user.last': 'Doe' } ]

关于javascript - 如何使用带有 sequelize.js 的 hasOne 引用两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37075666/

相关文章:

java - PostgreSQL 查询在 pgAdmin 中有效,但在 Java EclipseLink 中无效

java - 如何推迟 PostgreSQL 中表的读取,直到该表的触发器(调用 Java)结束?

javascript - 如何过滤包含具有多个字符串值的键的数组?

node.js - 如何使用 Node.js 在 MongoDB 中存储大量数字

node.js - 匹配API和同构路由

javascript - 如何思考 Node.js 中的异步回调操作

node.js - Postgres方言在sequelize -m中不起作用

javascript:IE 中的 getElementById 问题

javascript - ReactJS 在表外渲染 tbody 数据

javascript - 动态创建/删除元素