我有3个表:users
,subscriptions
,orders
。
subscriptions
表和orders
表都有user_id
列。我想在subscription
书架模型上定义一个关系,以便我获得最新订单。
现在我有一个非常混乱的解决方案。这是我的subscription
模型:
db.Model.extend({
tableName: 'subscriptions',
user() {
return this.belongsTo('User');
},
withLatestOrder() {
return qb => {
const orderQuery = db.knex('orders')
.innerJoin('users', 'users.id', 'orders.user_id')
.innerJoin('subscriptions', 'users.id', 'subscriptions.user_id')
.orderBy('orders.created_at', 'DESC')
.select('orders.id', 'subscriptions.id as subscription_id')
.as('oq');
const orderQueryGrouped = db.knex(orderQuery)
.groupBy('oq.subscription_id', 'oq.id')
.as('oqg');
qb
.leftJoin(orderQueryGrouped, 'oqg.subscription_id', 'subscriptions.id')
.leftJoin('orders', 'oqg.id', 'orders.id')
.select('subscriptions.*', 'orders.*');
};
}
})
这允许我做类似
的事情Subscriptions.forge().withLatestOrder().fetchAll();
问题是,orders
,即使它在SQL语句的结果中,也不在最终模型中。准备工作非常混乱,而且对我未来的自我并不是很明显。
有没有更好的方法来解决这个问题?