【问题标题】:javascript method chaining - knex.jsjavascript 方法链 - knex.js
【发布时间】:2018-10-12 04:10:27
【问题描述】:

我是一名 PHP 开发人员,对于一个新项目,我决定使用 node.js 后端。所以我对此很陌生。

我正在使用 knex.js 来处理我的数据库连接和操作数据。 F.ex 我有以下查询:

let gastronomies = await knex
  .from('user')
  .innerJoin('profile', 'user.id', 'profile.user_id')
  .where('user.status', 1);

如果客户端向函数传递了一个额外的变量,它应该被用作另一个查询参数

if(args.lat) {
    gastronomies = await knex
    .from('user')
    .innerJoin('profile', 'user.id', 'profile.user_id')
    .where('user.status', 1)
    .where('lat', 'like', args.lat); //there it is
  }

我想链接这些方法,但它根本不起作用。这是我想出的:

let gastronomies = await knex
  .from('user')
  .select('*', {key: 'user.id'})
  .innerJoin('profile', 'user.id', 'profile.user_id')
  .where('user.status', 1);

if(args.lat)
    gastronomies.where('lat', 'like', args.lat);

但它说美食没有一种叫做“哪里”的方法。有什么建议吗?

【问题讨论】:

    标签: javascript node.js knex.js


    【解决方案1】:

    如果你想链接它,你应该等待async/await,因为它会触发对数据库的调用。 我会这样做:

    const gastronomies = knex // no await here
      .from('user')
      .select('*', {key: 'user.id'})
      .innerJoin('profile', 'user.id', 'profile.user_id')
      .where('user.status', 1);
    
    if(args.lat)
        gastronomies.where('lat', 'like', args.lat);
    
    const response = await gastronomies;
    

    您还可以在此处通过 Promise 检查您的问题的答案:Can I conditionally add a where() clause to my knex query?

    【讨论】:

    • 您的回答有效,谢谢!我在没有“等待”的情况下构建我的查询,将它与我的条件链接起来,然后我只是做“返回等待美食”,它工作正常!
    【解决方案2】:

    查看文档 - 您可以使用一个对象传入多个 where 子句:

    .where({ first_name: 'Test', last_name: 'User' })

    http://knexjs.org/#Builder-where

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2019-01-11
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多