2013-09-29 2 views
8

문제점은 상태 유형 객체를 열심히로드하지 않는 hasOne 관계를 작동시킬 수 없다는 것입니다.연관 관계를 다시 열어주세요. hasOne, belongsTo

모든 쿼리는 기존 테이블에서 수행됩니다.

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

그리고 열망 만들어 여기에

은 고객 테이블의 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

답장을 보내 주시면 감사하겠습니다. classmethods를 사용하여 모델에 관계를 직접 추가 할 수도 있습니다. 아래 예제를 추가하여 이것이 도움이 되었기를 바랍니다!

사용자 모델 (파일)

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

좋은 예! 간단하고 기능적입니다. –