2013-09-29 74 views
8

问题是,我无法正常工作hasOne关系,它并不急于加载状态类型对象。续集关联hasOne,belongsTo

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

这里是customer表,什么重要的是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 }); 
     }); 

回答

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的关系是一个“后退关联”,这意味着外键位于客户表中。为此,您需要belongsTo

18

感谢您的回答,它帮了我很多。您还可以使用类方法直接在您的模型中添加关系。我在下面添加了一个例子,希望这有助于!

用户模型(文件)

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 
    }) 
+0

很好的例子!简单而实用。 –