Knex: Как правильно вернуть одно значение из запроса выбора?

Созданный на 18 апр. 2016  ·  4Комментарии  ·  Источник: knex/knex

Простой способ сделать запрос выбора в knex выглядит следующим образом:

db('table_name').where({ id: 1 }).select();

Но он возвращает массив. Поскольку id - уникальное поле, ясно, что я
ожидайте единственного результата. А потом мне нужно сделать что-то вроде этого:

db('table_name').where({ id: 1 }).select().then(result => result[0]);

Есть ли какой-нибудь _официальный_ способ вернуть одно значение?

question

Самый полезный комментарий

db('table_name').where({id: 1}).first().then((row) => row)

Должно сработать

Все 4 Комментарий

db('table_name').where({id: 1}).first().then((row) => row)

Должно сработать

О, на самом деле это first и я продолжаю искать one , selectOne и т. Д. Спасибо

БД ('имя_таблицы'). где ({идентификатор: 1}). первый (); это будет работать так же. нет?

@ arch-mage Если должен быть только один результат сопоставления, то рекомендуется обеспечить его, обычные реализации single делают это с использованием limit 2 . Вот как добавить его в Knex.

import Knex from 'knex'

declare module 'knex' {
  interface QueryInterface {
    _method: string
    _isSelectQuery: () => boolean
    single: (columns?: string | string[], notFoundMessage?: string, notSingleMessage?: string) => Promise<any>
  }
}

Knex.QueryBuilder.extend('single', function single(
  this: Knex.QueryBuilder,
  columns: string | string[] = '*',
  notFoundMessage?: string,
  notSingleMessage?: string,
): any {
  // eslint-disable-next-line no-underscore-dangle
  if (!this._isSelectQuery() || this._method === 'first')
    // eslint-disable-next-line no-underscore-dangle
    throw new Error(`Cannot chain .single() on "${this._method}" query!`)
  // eslint-disable-next-line no-param-reassign
  if (typeof columns === 'string') columns = [columns]
  const allColumns = columns.includes('*')
  const singleColumn = !allColumns && columns.length === 1 ? columns[0] : false
  if (!allColumns) this.select(...columns)
  this.limit(2)
  return this.then((results: any[]) =>
    results.length === 1
      ? singleColumn
        ? results[0][singleColumn]
        : results[0]
      : results.length
      ? Promise.reject(notSingleMessage || `Query has more than one result: "${this.toSQL().sql}"`)
      : Promise.reject(notFoundMessage || `Query has no results: "${this.toSQL().sql}"`),
  )
} as any)

@wubzz, были бы вы заинтересованы в PR, добавив метод single к QueryInterface ?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

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

mtom55 picture mtom55  ·  3Комментарии

aj0strow picture aj0strow  ·  3Комментарии

koskimas picture koskimas  ·  3Комментарии

npow picture npow  ·  3Комментарии

legomind picture legomind  ·  3Комментарии