2013-09-29 7 views
8

Проблема в том, что я не могу заставить работать отношение hasOne, которое не хочет загружать объект типа состояния.Упорядочить ассоциации 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' 
    }); 

И создание нетерпеливый loading:

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

Я уверен, что ошибка в ваших ассоциациях где-то. От того, как вы описали структуру таблицы, то assocations должно выглядеть примерно так:

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

Вы не должны установить ForeignKey, sequelize будет обрабатывать его, если вы не 'указать дополнительные ключи.

Тогда в запросе:

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

Отличный пример! Простой и функциональный. –

Смежные вопросы