2014-11-06 57 views
0

supose這個模式:squelize協會:查詢從衆多的最後createdAt協會一對多關聯

var user = sequelize.define('user', { 
    username: Sequelize.STRING, 
    email: Sequelize.STRING, 
    password: Sequelize.STRING 
}, { 
    timestamps: true, 
    createdAt: 'created_at', 
    updatedAt: 'updated_at' 
}); 

var status = sequelize.define('status', { 
    status: Sequelize.STRING, 
    description: Sequelize.TEXT 
}, { 
    timestamps: true, 
    createdAt: 'created_at', 
    updatedAt: 'updated_at' 
}); 

var users_statuses = sequelize.define('users_statuses', { 
    user_id: Sequelize.INTEGER(11), 
    status_id: Sequelize.INTEGER(11), 
}, { 
    timestamps: true, 
    createdAt: 'created_at', 
    updatedAt: 'updated_at' 
}); 

user.hasMany(status, { foreignKey: 'user_id', through: models.users_statuses }); 
status.hasMany(user, { foreignKey: 'status_id', through: models.users_statuses }); 

所以每個用戶都有許多狀態(跟蹤所有選擇狀態的)。 使用查找與包含或getter user.getStatuses()我可以得到一個實際用戶的所有狀態,但我不知道如何獲得最後/當前關聯的狀態(基於created_at列users_statuses表/模型)

任何想法?

回答

3

速戰速決1個DB查詢。使用

user.find({ 
    where: {user_id : id }, 
    include: [{ 
     model: status, 
     attributes: ['status'] 
    }], 
    order: [ [ status, 'createdAt', 'DESC'] ] 
}).then(function(user) { 
    var latestStatus = user.status[0]; 
}).catch(function(err) { 
    console.log(err); 
}); 

但是這會浪費時間獲取所有不需要的狀態。如果你有很多狀態,Sequelize可能會浪費更多的時間來截斷結果,而不是進行額外的查詢。

一種更好的方式是搜索user_status表最新createdAt狀態,並做了status表另一個查詢:

user_status.find({ 
    where: {user_id: yourid} 
    order: [ 'createdAt', 'DESC'] 
}).then(function(user_status) { 
    var latest_status_id = user_status.status_id; 
    return status.find(where:{status_id: latest_status_id}); 
}).then..... catch....; 

有,當然是最好的辦法。但是這需要你將這些表與它的交叉表相關聯,而不是讓它們使用「through」來執行。

如果您user_status是一個強大的實體,它具有以下關係:

user_status.belongsTo(status, {foreignKey: status_id}); 

然後,你可以這樣做:

user_status.find({ 
    where: {user_id: id}, 
    include: [{ 
     model: status 
    }], 
    order: [ [ 'createdAt', 'DESC' ] ] 
}).then.... 

的基本思路是,「包括」只能用強大的實體。當你使用hasMany... through...時,交叉表是一個弱實體,不能具有「包含」。

+0

是啊,這解決了我的問題,thx! – MaK 2014-11-11 09:08:54

1

您可以使用:

.find({ limit: 1, order: 'updatedAt DESC' })

+0

不能明白你的意思。假設'myuser = user.find(1,{include:[status]})'so'myuser.statuses'將返回所有記錄的狀態,我想要的只是最後一個關聯狀態 – MaK 2014-11-07 10:10:02

+1

這是錯誤的答案。查找本質上有限制:1 – Calvintwr 2014-11-11 02:45:20