Как это сделать » ОБНОВЛЕНИЕ…УСТАНОВЛЕНО…ОТ` использования knex?

#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() , и это очевидный путь.