質問

私は現在、後遺症を実験していて、2つのオブジェクトを持っています。 PersonPosition, 、人のリストを取得するとき、私は彼らの立場を取得したいです。

モデル:

var User = sequelize.define('user', {
    first_name: Sequelize.STRING,
    last_name: Sequelize.STRING 
});

var Position = sequelize.define('position', {
    name: Sequelize.STRING,
    affiliation: Sequelize.STRING
});

Position.hasMany(User, { foreignKey : 'position_id' });
User.belongsTo(Position, { foreignKey : 'position_id'});

私の質問:

User.findAll({ fetchAssociations: true }, function(results) {
    //I've tried doing some work in here, but haven't found the correct procedure. 
}).on('success', function(results) {
    res.render('users', {
        title: 'user page',
        users: results
    });
});

ログを見ることは決してクエリではありません Person まったく。 QueryChainingを使用する必要がありますか?ドキュメントから、Associationを自動化する必要があると思われることがわかりました。

役に立ちましたか?

解決

ここでは、あなたの問題を修正する方法の完全な例(そして、それはがらくたです):

User.findAll().on('success', function(users) {
  var chainer = new Sequelize.Utils.QueryChainer
    , _users  = []

  users.forEach(function(u) {
    var emitter = new Sequelize.Utils.CustomEventEmitter(function() {
      u.getPosition().on('success', function(pos) {
        _users.push({user: u, position: pos})
        emitter.emit('success')
      })
    })
    chainer.add(emitter.run())
  })
  chainer.run().on('success', function() {
    res.render('users', {
      title: 'user page',
      users: _users
    })
  })
})

これにより、最初にすべてのユーザーが取得され、次に各ユーザーの位置を取得し、_users-Arrayに保存します。その後、ページをレンダリングします。テストされていませんが、トリックを行う必要があります。

他のヒント

2013年4月からv1.7.0で拡張するためだけに必要です 協会 に:

Position.hasMany(User, {foreignKey : 'position_id', as: 'User'});
User.belongsTo(Position, {foreignKey : 'position_id', as: 'Posit'});

そして、関連するポジションを持つすべてのユーザーを見つけます

User.findAll({
      include: [{
        model: Position, as: 'Posit'
      }]
}).success(function(match) {
    // your logic
});

1.0の後遺症を書き直したので、フェチソーシエーションのサポートを削除しました。次の週に追加します。しかし、あなたのコードを見てみましょう:

アンダースコアのような列名を使用しているので、おそらく自動的に生成された列にはアンダースコアオプションを使用する必要があります。 http://www.sequelizejs.com/?act = usage#usage - >少し下にスクロールするか、アンダースコアを検索します。これにより、BelongSto/Hasmanyのオプションを節約できます。

FindallでやりたいのはSMTHです。このような:

User.findAll().on('success', function(users) {
  // asd
})

そして、私がちょうど気づいたように...関連するすべてのオブジェクトを取得するのはややトリッキーです:Dは今のところとても多くのことです。それが助けてくれることを願っています。

これにより、モデルに関するどこでもアクションのためにJSONをシリアル化できます。それを読んでください、とてもよく、私はそれが最良の方法だと思います

後遺症 - 仮想フィールド

// define models 
var Person = sequelize.define('Person', { name: Sequelize.STRING });
var Task = sequelize.define('Task', {
name: Sequelize.STRING,
nameWithPerson: {
    type: Sequelize.VIRTUAL,
    get: function() { return this.name + ' (' + this.Person.name + ')' }
    attributes: [ 'name' ],
    include: [ { model: Person, attributes: [ 'name' ] } ],
    order: [ ['name'], [ Person, 'name' ] ]
}
});

// define associations 
Task.belongsTo(Person);
Person.hasMany(Task);

// activate virtual fields functionality 
sequelize.initVirtualFields();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top