#sql #postgresql #knex.js #postgresql-10
Вопрос:
Каков самый краткий способ выразить UPDATE...SET...FROM
инструкцию SQL с помощью knex? Это то, что у меня есть в настоящее время:
const query =
knex('user_subscriptions').update(subscription).toQuery()
knex.raw(
' from plans p where customer_id = ? and p.id = us.plan_id '
'returning us.*, p.name',
[customer_id]
);
Причина, по которой я это делаю, заключается в том, что я хочу эффективно возвращать поле из связанной таблицы (стиль ОБЪЕДИНЕНИЯ) без необходимости отдельного запроса.
Ответ №1:
Как указано на официальном сайте: knexjs.org/#Builder-update
knex('user_subscriptions')
.returning(['us.*', 'plans.name', 'customer_id'])
.where({
customer_id: '?',
plans.id: us.plan_id
})
.update({
subscription : '?
})
Делает:
update `user_subscriptions` set `subscription ` = '?' where `customer_id` = '?' and 'plans.id' = 'us.plan_id'
ВОЗВРАТ:
[ us.*: ..., plans.name: ..., customer_id: ... ]
Комментарии:
1. И как мы получим
plans
таблицу в этом запросе?p.id
это ничего не значит.. это ни на что не ссылается.2. Я только что внес правку в ответ на ваш вопрос. Надеюсь, это поможет 🙂
3. Не поймите меня неправильно, но вам, вероятно, следует изучить SQL, прежде чем отвечать на вопросы людей по этой теме.
Ответ №2:
почему бы не построить все до конца сырым:
let query = knex.raw(
'update user_subscriptions '
'set subscription = ?, '
'where p.id = us.plan_id '
'and customer_id = ? '
'returning us.*, p.name '
, [customer_id]
);
results = query.rows
Комментарии:
1. Я уже использую
knex.raw()
, и это очевидный путь.