Knex,Objection.js,如何按关联数排序

Knex, Objection.js, How to sort by number of associations

我有一个 Express API 通过 Knex 和 Objection 使用 Postgres。

我想设置一个模型方法或范围,returns 一个父模型实例数组,按照关联子模型的数量排列。

我已查看 Knex 反对文档

我看到了以下 SQL 适合的查询,但试图弄清楚如何在 Knex 中执行此操作:

SELECT SUM(O.TotalPrice), C.FirstName, C.LastName
  FROM [Order] O JOIN Customer C 
    ON O.CustomerId = C.Id
 GROUP BY C.FirstName, C.LastName
 ORDER BY SUM(O.TotalPrice) DESC

如果有人感兴趣,我只是包含了原始 SQL 查询如下:

router.get('/leaderboard', async (req, res) => {
  let results = await knex.raw('SELECT users_id, username, COUNT(acts.id) FROM acts INNER JOIN users ON acts.users_id = users.id GROUP BY users_id, username ORDER BY COUNT(acts.id) DESC');
  console.log(results);
  res.json(results.rows);
});

knex (https://runkit.com/embed/rj4e0eo1d27f) 应该这样做:

function sum(colName) {
  return knex.raw('SUM(??)', [colName]);
}

knex('Order as O')
  .select(sum('O.TotalPrice'), 'C.FirstName', 'C.LastName')
  .join('Customer C', 'O.CustomerId', 'C.Id')
  .groupBy('C.FirstName', 'C.LastName')
  .orderBy(sum('O.TotalPrice'), 'desc')

// Outputs: 
// select SUM("O"."TotalPrice"), "C"."FirstName", "C"."LastName" 
//   from "Order" as "O" 
//   inner join "Customer C" on "O"."CustomerId" = "C"."Id" 
//   group by "C"."FirstName", "C"."LastName" 
//   order by SUM("O"."TotalPrice") desc

但是如果你真的在使用 objection.js 那么你应该为你的 OrderCustomer 表设置模型并做这样的事情:

await Order.query()
  .select(sum('TotalPrice'), 'c.FirstName', 'c.LastName')
  .joinRelated('customer as c')
  .groupBy('c.FirstName', 'c.LastName')
  .orderBy(sum('TotalPrice'), 'desc')