KnexJS Как создать несколько внутренних соединений - PullRequest
1 голос
/ 01 июня 2019

Мне нужно преобразовать этот запрос SQL в запрос KnexJS

SELECT
    Book.Title,
    Book.Number,
    Author.Name,
    Author_1.Name,
    Author_2.Name,
    Author_3.Name
FROM
    ((((Book)
INNER JOIN Author ON Book.AuthName = Author.Name)
INNER JOIN Author AS Author_1 ON Book.AuthName = Author_1.Name)
INNER JOIN Author AS Author_2 ON Book.AuthName = Author_2.Name)
INNER JOIN Author AS Author_3 ON Book.AuthName = Author_3.Name
WHERE Book.Title = "HelpMe" ORDER BY Book.Number;

Я прочитал документ здесь https://knexjs.org/#Builder-join, но я едва понял, как использовать данный пример для удовлетворения моих потребностей, потому что нет примера для такого множественного внутреннего соединения.

Помогите мне, пожалуйста

1 Ответ

2 голосов
/ 01 июня 2019

Соединения Knex являются цепочечными, поэтому вы можете делать такие вещи:

knex
  .select('title', 'author1', 'author2')
  .from('books')
  .join('authors as author1', 'books.author_name', '=', 'author1.name')
  .join('authors as author2', 'books.author_name', '=', 'author2.name')

Я подозреваю, что в вашем примере есть проблема, поскольку вы в основном выполняете одно и то же сравнение снова и снова,Обычно вы бы связывались с таблицей authors, используя серию внешних ключей (author1id, author2id) или, что более правильно, с таблицей соединения, поскольку это отношение MANY - MANY:

knex
  .select('books.title', 'authors.name')
  .from('books')
  .join('books_authors', 'books.id', '=', 'books_authors.book_id')
  .join('authors', 'authors.id', '=', 'books_authors.author_id')

Этозахватывает всех авторов книги, независимо от того, сколько их, но требует дополнительной таблицы, состоящей только из идентификаторов:

exports.up = knex =>
  knex.schema.createTable('books_authors', t => {
    t.integer('book_id').references('books.id')
    t.integer('author_id').references('authors.id')
  })

exports.down = knex => knex.schema.dropTable('books_authors')

Каждый раз, когда вы добавляете автора в книгу, вы также добавляетеидентификатор книги и идентификатор автора в таблице соединений, так что между ними существует связь.Таким образом, каждая книга может иметь одного автора или сотню.

...