2013-09-29 12 views
8

Das Problem ist, dass ich nicht arbeiten kann die Beziehung hasOne, die nicht eifrig lädt das Zustandstyp-Objekt.Sequelize Assoziationen hasOne, gehört zu

Alle Abfragen werden für vorhandene Tabellen ausgeführt. Hier

ist der Kunde Tisch, was wichtig ist das cst_state_type Feld:

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 Tabelle:

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

Wie die Beziehungen beschrieben:

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

und die Schaffung von eifrigen Ladeanfrage:

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

Antwort

2

Ich bin mir ziemlich sicher, dass der Fehler in Ihren Assoziationen irgendwo ist. Von der Art und Weise Sie Ihre Tabellenstruktur beschrieben, sollten die assocations etwa wie folgt aussehen:

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

wie ich es verstehe, kann der gleiche Zustand vieler Kunden zugeordnet werden, daher StateType.hasMany. Die Beziehung von Kunde -> Staatstyp ist eine "Rückverknüpfung", dh der Fremdschlüssel befindet sich in der Kundentabelle. Dafür brauchst du belongsTo

18

Danke für deine Antwort, es hat mir sehr geholfen. Sie können die Beziehungen auch direkt in Ihrem Modell hinzufügen, indem Sie Klassenmethoden verwenden. Ich habe unten ein Beispiel hinzugefügt, hoffe, das hilft!

Benutzer Modell (Datei)

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

Kommentar Modell (Datei):

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

Sie haben nicht die foreignkey zu setzen, wird sequelize damit umgehen, wenn Sie don Geben Sie keine Fremdschlüssel an.

Dann in der Abfrage:

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

Hervorragendes Beispiel! Einfach und funktional. –