Esta es mi subconsulta:
const subquery = async () => { return await knex.select('*') .from('contracts') .where('estate_id', '=', estateid) }Y así es como lo estoy insertando en la declaración de unión:
const data = await knex('clients') .join(await subquery(), 'clients.client_id', 'contracts.client_id')Pero esto da como resultado un error, mi pregunta es cuál es la forma correcta de escribir una subconsulta y luego incluirla dentro de una declaración de combinación, usando async/await.
En los documentos hay una mención sobre las subconsultas, pero no es para el caso de combinación y no intento adaptarlo a un caso de combinación:
knex('users').where('votes', '>', 100) const subquery = knex('users') .where('votes', '>', 100) .andWhere('status', 'active') .orWhere('name', 'John') .select('id'); knex('accounts').where('id', 'in', subquery)No es necesario esperar la subconsulta, simplemente puede pasar una función que represente la subconsulta como el primer argumento de la combinación. es decir
const data = await knex('clients') .join(function() { this.select('*') .from('contracts') .where('estate_id', '=', estateid); }, 'clients.client_id', 'contracts.client_id'); Tenga en cuenta que la referencia a knex cambia de knex a this una vez dentro de la subconsulta. Si desea mantener la subconsulta separada, debería poder hacerlo como
const subquery = function() { this.select('*') .from('contracts') .where('estate_id', '=', estateid) } const data = await knex('clients') .join(subquery, 'clients.client_id', 'contracts.client_id')