Sequelize 关联 hasOne,belongsTo

Posted

技术标签:

【中文标题】Sequelize 关联 hasOne,belongsTo【英文标题】:Sequelize associations 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 );
        );

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Sequelize 关联 hasOne,belongsTo的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize ORM中HasOne和BelongsTo的区别

续集更新或创建包含的关联

Sequelize 基于关联的查找

nodejs + sequelize :: 在需要的地方包含 false

续集关联 On 或 ON

如何将模型与 GraphQL 界面上的“具有一个”关系相关联