Las respuestas de SQL son tablas planas por su naturaleza, por lo que, además de knex, necesitará una biblioteca externa que pueda reconstruir información plana en objetos anidados.
La mayoría de las bibliotecas ORM saben cómo hacerlo. Por ejemplo objection.js
que está construido sobre knex usa .eager()
para obtener relaciones anidadas. Con objeción.js ORM, la consulta se vería así Project.query().where('id', 1).eager('employees')