Olá, excelente trabalho da equipe Knexjs. Estou testando knexjs sobre ORM com um pequeno exemplo tendo muitos para muitos relacionamento. O exemplo é de autores e livros, em que a tabela de autores e a tabela de livros têm muitos para muitos relacionamentos por meio da tabela author_books. Quero obter um livro específico com todos os autores. Abaixo está a consulta bruta que dá o resultado esperado. Mas não estou conseguindo como construir essa consulta usando Knexjs? Qualquer ajuda seria apreciada.
Observação: estou usando Knexjs com javascript ES6.
SELECT `book`.`id` , `book`.`title` , `authors`.`id` AS `authors.id` , `authors`.`name`
AS `authors.authorname` , `authors.author_books`.`book_id`
AS `authors.author_books.bookId` , `authors.author_books`.`author_id`
AS `authors.author_books.author_id`
FROM `books` AS `book`
LEFT OUTER JOIN (
`author_books` AS `authors.author_books`
INNER JOIN `authors` AS `authors` ON `authors`.`id` = `authors.author_books`.`author_id`
) ON `book`.`id` = `authors.author_books`.`book_id`
WHERE `book`.`id` =1
esta é a consulta que estou tentando construir usando Knexjs.
this.Knex('books as book')
.leftOuterJoin('author_books as authors.author_books', function(){
// How could I nest INNER JOIN in LEFT OUTER JOIN
this.on('book.id', 'authors.author_books.book_id')
}).select('book.id', 'book.title', 'authors.id as authors.id'
, 'authors.name as authors.name', 'authors.author_books.book_id as authors.author_books.book_id'
, 'authors.author_books.author_id as authors.auhtor_books.author_id')
.where('book.id', id)
Por favor, deixe-me saber se estou errado em algum lugar?
A questão é como aninhar consultas de junção usando knexjs? Inner Join aninhado com Left ou Right JOIN usando knex, para que o knex possa construir uma consulta SQL como mostrado acima na seção Query:?
@saurabhghewari você já encontrou uma solução para essa questão? Estou tentando fazer algo semelhante.
Devo dizer que não tenho certeza se o knex oferece suporte a junções aninhadas ... Não vi nenhum teste ou documentação para esse caso, então tenho certeza de que eles não são suportados. Por favor, adicione solicitação de recurso para isso.
Comentários muito úteis
A questão é como aninhar consultas de junção usando knexjs? Inner Join aninhado com Left ou Right JOIN usando knex, para que o knex possa construir uma consulta SQL como mostrado acima na seção Query:?