Соединения 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')
Каждый раз, когда вы добавляете автора в книгу, вы также добавляетеидентификатор книги и идентификатор автора в таблице соединений, так что между ними существует связь.Таким образом, каждая книга может иметь одного автора или сотню.