我对Analytics项目有以下架构:
访问有会话,会话有会话数据。
我正在尝试编写一个Bookshelf查询,它将为我提供访问的最新会话数据条目,而无需使用完全“原始”查询。
所以SQL查询是这样的:
select sd.* from session_data sd
join sessions s on sd.session_id = s.id
join visits v on s.visit_id = v.id
where v.id = 28
having max(sd.created_at)
我所有的Bookshelf模型都有适当的关系,但我不确定如何在“书架说话”中构建查询?
var Visit = bookshelf.Model.extend({
tableName: 'visits',
hasTimestamps: true,
Sessions: function() {
return this.hasMany('Session');
}
});
var Session = bookshelf.Model.extend({
tableName: 'sessions',
hasTimestamps: true,
visit: function() {
return this.belongsTo('Visit');
},
sessionData: function() {
return this.hasMany('SessionData');
}
});
var SessionData = bookshelf.Model.extend({
tableName: 'session_data',
hasTimestamps: true,
session: function() {
return this.belongsTo('Session');
}
});
答案 0 :(得分:0)
这应该可以帮助你:
Visit.where('id', visitID)
.fetch({ withRelated: [{
'sessions.session_data': function(qb) {
qb.orderBy('created_at', 'desc').limit(1);
}
}] })
.then(function(visit) {
var session = visit.related('sessions').at(0), // Get an arbitrary session.
sessionData = session.related('session_data');
});
sessionData将是一个数组,但应始终不超过一个元素。