【问题标题】:Sequelize associations hasOne, belongsToSequelize 关联 hasOne,belongsTo
【发布时间】:2013-10-05 05:30:13
【问题描述】:

问题是我无法使用关系 hasOne,它不会急切加载状态类型对象。

所有查询都在现有表上完成。

这是客户表,重要的是cst_state_type字段:

module.exports = function(sequelize, DataTypes) {

    return sequelize.define('customer', {

        customer: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            allowNull: true,
            validate: {
                isNumeric: true
            }
        },
        first_name: {
            type: DataTypes.STRING(100),
            validate: {
                isAlphanumeric: true
            }
        },
        last_name: DataTypes.STRING(100),
        identity_code: {
            type: DataTypes.STRING(20),
            allowNull: true,
            validate: {
                isNumeric: true
            }
        },
        note: DataTypes.STRING(1000),
        birth_date: DataTypes.DATE,


        created_by: DataTypes.INTEGER,
        updated_by: DataTypes.INTEGER,

        cst_type: DataTypes.INTEGER,
        cst_state_type:  {
            type: DataTypes.INTEGER,
        }

    }, {
        tableName: 'customer',

        updatedAt: 'updated',
        createdAt: 'created',
        timestamps: true
    });
};

cst_state_type 表:

module.exports = function(sequelize, DataTypes) {

    return sequelize.define('StateType', {

        cst_state_type: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true,
            validate: {
            }
        },
        name: DataTypes.STRING(100),
    }, {
        tableName: 'cst_state_type',
        timestamps: false
    });
};

如何描述关系:

  global.db.Customer.hasOne(global.db.StateType, {
    foreignKey: 'cst_state_type',
    as: 'state_type'
  });

  global.db.StateType.belongsTo(global.db.Customer, {
    foreignKey: 'cst_state_type'
  });

并创建急切加载查询:

    db.Customer.findAll( {
        include: [
            { model: db.Address, as: 'addresses' },
            { model: db.StateType, as: 'state_type' }
        ]
    })
        .success(function (customers) {
            res.json(200, customers);
        })
        .fail(function (error) {
            res.json(500, { msg: error });
        });

【问题讨论】:

    标签: node.js postgresql orm sequelize.js


    【解决方案1】:

    谢谢你的回答,对我帮助很大。您还可以使用类方法直接在模型中添加关系。我在下面添加了一个示例,希望对您有所帮助!

    用户模型(文件)

    module.exports = function(sequelize, DataTypes){
        var User = sequelize.define(
            'User', {
                name: {
                    type: DataTypes.STRING,
                    allowNull: false
                }
            },
            {
                classMethods:{
                    associate:function(models){
                        User.hasMany(models.Comment, { foreignKey: 'userId'} );
                    }
                }
            }
    
        );
        return User;
    };
    

    评论模型(文件):

    module.exports = function(sequelize, DataTypes){
        var Comment = sequelize.define(
            'Comment', {
                text: {
                    type: DataTypes.STRING,
                    allowNull: false
                }
            },
            {
                classMethods:{
                    associate:function(models){
                        Comment.belongsTo(models.User, { foreignKey:'userId'} );
                    }
                }
            }
    
        );
        return Comment;
    };
    

    你不必设置外键,如果你不指定外键,sequelize 会处理。

    然后在查询中:

    models.Comment.find({
            where: { id: id },
            include: [
                models.User
            ],
            limit: 1
        })
    

    【讨论】:

    • 很好的例子!简单实用。
    • 点赞!您是否必须同时添加 user.hasMany 和 Comments.belongsTo 或其中之一就足够了?如果有,那是哪一个?
    【解决方案2】:

    我很确定错误出在您的关联中。从您描述表结构的方式来看,关联应该如下所示:

    global.db.Customer.belongsTo(global.db.StateType, {
        foreignKey: 'cst_state_type',
        as: 'state_type'
    });
    
    global.db.StateType.hasMany(global.db.Customer, {
        foreignKey: 'cst_state_type'
    });
    

    据我了解,相同的状态可以分配给许多客户,因此StateType.hasMany。 customer -> statetype 的关系是“反向关联”,这意味着外键在 customer 表中。为此,您需要belongsTo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 2016-04-06
      • 2019-02-15
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 2014-06-30
      相关资源
      最近更新 更多