Knex: 从选择查询返回单个值的正确方法是什么?

创建于 2016-04-18  ·  4评论  ·  资料来源: knex/knex

在knex中执行选择查询的简单方法是这样的:

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

但是,它返回一个数组。 由于id是一个唯一字段,因此很明显
期待一个结果。 然后,我必须执行以下操作:

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

有没有任何_official_方法返回单个值?

question

最有用的评论

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

应该管用

所有4条评论

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

应该管用

哦,实际上是first ,我一直在寻找oneselectOne等。谢谢

db('table_name')。where({id:1})。first(); 这将相同。 没有?

@ 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中的PR感兴趣吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

nklhrstv picture nklhrstv  ·  3评论

sandrocsimas picture sandrocsimas  ·  3评论

tjwebb picture tjwebb  ·  3评论

marianomerlo picture marianomerlo  ·  3评论

arconus picture arconus  ·  3评论