2015-04-01 4 views
4

Я проработал около 20 лет с базами данных SQL и, похоже, не понимаю, как использовать метод Knex для сопоставления запросов. Может кто-нибудь помочь мне получить правильный код?Как выбрать конкретные столбцы из объединенной таблицы в Knex.js?

У меня есть этот SQL запрос, который я хочу использовать в моем nodejs применения:

SELECT p.id, p.project_number, p.project_name, p.start_date, p.end_date, 
    o.name, o.email_addr, 
    c.company, c.email_addr AS company_email, c.first_name, c.last_name 
FROM projects p 
INNER JOIN owners o ON o.id = p.owner_id 
INNER JOIN clients c ON c.id = p.client_id 

KnexJS (0.7.5) документация показывает пример, который будет выглядеть, как это для моего запроса:

knex.from('projects').innerJoin('owners', 'owners.id', 'projects.owner_id') 
    .innerJoin('clients', 'clients.id', 'projects.client_id'); 

Есть несколько вещей, которые я не могу найти в документации:

1) как выбрать, какие столбцы я хочу включить? Проекты, клиенты и владельцы имеют по 20-50 столбцов, и я не интересуюсь ими. Выбор столбцов из основной таблицы является ясным (с использованием select() или столбец()), но как выбрать столбцы из объединенных таблиц?

2) Некоторые столбцы имеют одинаковые имена. Как избежать конфликтов имен (т. Е. Добавить префикс в столбцы из других таблиц)? Я посмотрел, как Knex может генерировать псевдонимы столбцов (... AS ...), и я не уверен, что это жизнеспособный вариант для более сложных запросов. (Даже для относительно простых запросов, как один из приведенной выше)

ответ

8

Вы можете попробовать:

knex('projects').select(['projects.id', 'projects.project_number', 'projects.project_name', 'projects.start_date', 'projects.end_date', 
    'owners.name', 'owners.email_addr as owner_email_addr', 
    'clients.company', 'clients.email_addr as client_email_addr', 'clients.first_name', 'clients.last_name']) 
.innerJoin('owners', 'owners.id', 'projects.owner_id') 
.innerJoin('clients', 'clients.id', 'projects.client_id'); 

Надеется, что это помогает!

Смежные вопросы