Knex: рдЪреБрдирд┐рдВрджрд╛ рдХреНрд╡реЗрд░реА рд╕реЗ рдПрдХрд▓ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 18 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: knex/knex

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓реЗрдХреНрд╕ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

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

рд▓реЗрдХрд┐рди, рдпрд╣ рдПрдХ рд╕рд░рдгреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ id рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдореИрдВ
рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рд╣реИред рдФрд░ рдлрд┐рд░, рдореБрдЭреЗ рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

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

рдХреНрдпрд╛ рдХреЛрдИ рдПрдХрд▓ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

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

рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдУрд╣, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ first рдФрд░ рдореИрдВ one , selectOne , рдЖрджрд┐ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд░рд╣рддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж

db ('table_name')ред рдЬрд╣рд╛рдБ ({id: 1})ред рдкрд╣рд▓рд╛ (); рдпрд╣ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдирд╣реАрдВ рди?

@ рдХрдЯреНрдЯрд░-рджрд╛рдирд╛ рдпрджрд┐ рдХреЗрд╡рд▓ рдПрдХрд▓ рдорд┐рд▓рд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдЖрдо single рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕реЗ limit 2 ред рдЗрд╕реЗ рдХреИрд╕реЗ рдХреНрдиреЗрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред

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 рдХреНрдпрд╛ рдЖрдкрдХреЛ single QueryInterface рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА PR рдореЗрдВ рд░реБрдЪрд┐ рд╣реЛрдЧреА?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕