关系中的子查询

时间:2016-08-17 20:53:55

标签: bookshelf.js knex.js

我有3个表:userssubscriptionsorders

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语句的结果中,也不在最终模型中。准备工作非常混乱,而且对我未来的自我并不是很明显。

有没有更好的方法来解决这个问题?

0 个答案:

没有答案