2011-06-15 29 views
8

我目前正在試驗Sequelize,並有兩個對象,一個是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嗎?從文檔中我發現它似乎應該自動獲取關聯。

回答

5

確定這裏一個完整的例子如何解決你的問題(是的,這是廢話):

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-陣列。之後它呈現該頁面。它沒有測試,但應該做的伎倆。

+0

感謝這段代碼,我會在這裏稍微介紹一下 – 2011-06-16 12:08:26

+0

你的代碼對我的幫助非常大。你有想法實現一個CustomEventEmitter?因爲它甚至不在API中。 – lemon 2012-03-21 16:26:26

+0

實際上遇到麻煩,因爲它不斷返回填入最後輸入用戶的用戶。 :| – lemon 2012-03-21 16:40:27

4

因爲我爲1.0重寫了sequelize我刪除了fetchAssociations的支持。我將在接下來的幾周內添加它。但讓我們來看看您的代碼:

您正在使用類似於下劃線的列名稱,因此您可能希望對自動生成的列使用下劃線選項:http://www.sequelizejs.com/?active=usage#usage - >向下滾動或搜索下劃線。這可能爲您節省belongsTo/hasMany的選項。

你想用findAll做什麼是不合適的。像這樣:

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

而且正如我剛纔注意到......這有點棘手得到所有相關的對象:D這麼多的現在。希望有所幫助。

+0

非常感謝您的答覆。如果我正確理解你,在v1.0的sequelize中,目前沒有獲取關聯對象的功能。感謝下劃線的提示,我現在是對一個簡單的,但已有的數據庫的「概念驗證」,我會把它記下來。 – 2011-06-15 20:30:35

+0

哦,有關聯支持,但不是通過fetchAssociation。你可以做user.getPosition()。on('success',...我會稍後發佈一個解決你的問題的解決方法 – sdepold 2011-06-16 04:48:00

+0

順便說一下,我是sascha而不是sven:D你在哪裏讀過這個文件? – sdepold 2011-06-16 04:54:45

8

從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 
}); 
+0

謝謝你的男人!剛剛救了我的一天! – 2014-04-24 19:02:47

0

這允許序列化一個JSON任何關於模型的動作。讀它,非常好,我認爲這是最好的辦法

sequelize-virtual-fields

// 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();