Associationが戻ってくることを続けています
-
28-10-2019 - |
質問
私は現在、後遺症を実験していて、2つのオブジェクトを持っています。 Person
と Position
, 、人のリストを取得するとき、私は彼らの立場を取得したいです。
モデル:
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();