2017-01-13 24 views
0

ユーザーとチームの間に2つのモデルとHasMany関係を定義しました。私の最終的なコードは次のようなものです:モデルの外部キー列名を動的に取得

app.listen(3000, function() { 
    sequelize = new Sequelize('mysql://username:[email protected]:3306/restful_api_demo'); 

sequelize 
    .authenticate() 
    .then(function (err) { 
     console.log('Connection has been established successfully.'); 
     User = sequelize.define('users', { 
      firstName: { type: Sequelize.STRING }, 
      lastName: { type: Sequelize.STRING } 
     }); 

     Team = sequelize.define('teams', { 
      teamName: { type: Sequelize.STRING }, 
      projectName: { type: Sequelize.STRING } 
     }); 

     Team.hasMany(User, { foreignKey: 'teamId' }); 

     //get all model names into an array 
     var modelObj = sequelize.models; 
     for (var key in modelObj) { 
      var value = modelObj[key]; 
      models.push(value); 
     } 

     models.forEach(function (m) { 
      // Read the model name 
      var modelName = m.getTableName(); 

      var assotions = m.associations; 
      for (key in assotions) { 
       var assotionType = assotions[key].associationType; 
       var assoModel = sequelize.model(key); 
       app.get('/' + modelName + '/:id/' + key, function (req, res) { 
        var id = req.params.id; 
        assoModel.findAll(
         { 
          where: { teamId: id } 
         }).then(function (i) { 
          res.json(i); 
         }); 
       }); 
      } 
     }) 
    }) 
    .catch(function (err) { 
     console.log('Unable to connect to the database:', err); 
    }); 
}); 

これは以下の通りです。 http://localhost:3000/teams/1/users

[ 
    { 
     "id": 1, 
     "firstName": "John1", 
     "lastName": "Hancock1", 
     "createdAt": "2017-01-12T07:06:53.000Z", 
     "updatedAt": "2017-01-12T07:06:53.000Z", 
     "teamId": 1 
    }, 
    { 
     "id": 2, 
     "firstName": "John2", 
     "lastName": "Hancock2", 
     "createdAt": "2017-01-12T07:18:48.000Z", 
     "updatedAt": "2017-01-12T07:18:48.000Z", 
     "teamId": 1 
    } 
] 

クエリに外部キーを取得するコードを変更しました。

var foreign = assotions[key].foreignKey; 
    var assoModel = sequelize.model(key); 
    app.get('/' + modelName + '/:id/' + key, function (req, res) { 
    var id = req.params.id; 
    assoModel.findAll({ 
     where: {foreign: id} 
    }).then(function (i) { 
     res.json(i); 
    }); 
    }); 

このエラーが発生します。

Unhandled rejection SequelizeDatabaseError: ER_BAD_FIELD_ERROR: Unknown column 'users.foreign' in 'where clause' 

変数名の代わりにこの変数の値をクエリに取得するにはどうすればよいですか?

+0

を持っていますか? – farhadamjady

+0

私のクエリで、その外部キー(teamId)のカラム名を 'where:{teamId:id}'としています。 – IsuruAb

+0

括弧に注意してください: ':[[foreign]:id} //これがうまくいくでしょう。 (それはあなたのコードをテストする私のミニプロジェクトで動作します) –

答えて

1

団体は「associationType」メソッドを持っているだけでなく、あなたの疑問をクリアすることができますが、使用は、クエリ内の任意の場所を定義したことを外部キーを使用していませんでし FOREIGNKEY方法

... 
var foreign = assotions[key].foreignKey; 
var query = { 
    [foreign]: id // value you want 
} 
... 
assoModel.findAll({ 
    where: query 
}).then(function (i) { 
    res.json(i); 
}); 
関連する問題