gpt4 book ai didi

knex.js - 是否有等同于 knex.pluck() 的函数,它将返回多列的值?

转载 作者:行者123 更新时间:2023-12-04 12:43:35 33 4
gpt4 key购买 nike

How to return a plain value from a Knex / Postgresql query? ,我询问了如何从 Knex 查询中获取列值,而没有包含列名的 JSON 对象。我被建议使用 pluck(fieldName)

如果我在查询中返回单个列,则效果很好。如何以相似的格式返回多个列?我正在寻找类似 pluck([fieldName1, fieldname2])pluck(fieldName1, fieldname2) 的东西,对于每一行,返回 ["value1", “值 2”]

最佳答案

让我们首先回顾一下 knex.js 是如何实现的目前实现pluck然后看看我们是否可以找到适合您需求的可行解决方案。

本质上,pluck 所做的是修改查询以在 select 语句中包含 pluck 列,然后使用 lodash.map 处理响应。只返回一个 pluck 字段值数组(而不是结果对象数组)。这意味着它在内部运行类似 lodash.map(resultsArray, pluckColumnName); 的查询结果。

因此,使用微小的代码示例意味着:

常规查询:

  1. knex('product').limit(10);//常规查询
  2. SELECT * FROM `product` LIMIT 10//转换为通配符从表中选择
  3. [{id: 1, name: 'foo'}, {...}]//结果是包含表中所有列的对象数组

使用 pluck 进行常规查询:

  1. knex('product').limit(10).pluck('id');//用 pluck 查询
  2. SELECT id FROM `product` LIMIT 10//转换为特定列选择
  3. loadsh.map(results, 'id')//knex 在内部对结果运行 loadsh.map
  4. [1, 2, 3, ...]//我们得到 pluck 列值的数组

如果您希望提取多列,您只需将结果映射函数更改为返回一个包含多个值的数组,而不是仅返回一个值。这可以通过多种方式完成:

解决方案#1:

最简单的方法是在查询中手动包含 pluck 列,然后定期运行 Array Map在结果上。代码看起来像这样:

// construct the query, make sure the fields you want to get values for are present
// it's best to include them in the .select statement because you really don't care for other fields
const query = knex('product').select('id', 'name').limit(10);

return query
.then(results => {
return results.map(result => [result.id, result.name]);
})
.then(pluckedResults => {
// pluckedResults: [[1, 'foo'], [2, 'bar'], [3, 'etc'], ...]];
return pluckedResults;
});

解决方案#2:可以扩展 knex QueryBuilder 以在所有查询上使用自定义函数。因此,我们将创建 multi-pluck.js 并为 knex 定义一个 .multiPluck QueryBuilder 扩展。

/**
* multi-pluck.js
* We are extending knex QueryBuilder to offer multi column pluck feature
* We add the pluck columns to the original query select statement and process result to return
* only the values of pluck columns in the same order they are defined
*
* Please note that .multiPluck() needs to be last in the chain as it executes the query and breaks
* query chaining.
*/

const QueryBuilder = require('knex/lib/query/builder');

Object.assign(QueryBuilder.prototype, {
multiPluck: function multiPluck (...pluckColumns) {
// add pluck columns to the query.select
this.select(...pluckColumns);

// run the query and map results
return this.then(results => {

// go over all result Objects
return results.map(result => {

// for each result Object, return an array of values for each pluckColumns
return pluckColumns.map(pluckColumn => {

// if pluck column includes table name like product.id, only use id field here
if (pluckColumn.indexOf('.') !== -1) {
pluckColumn = pluckColumn.split('.').slice(-1)[0];
}

// return given column value from this result row
return result[pluckColumn];
});
});
});
}
});

要使用它,您需要执行以下操作:

// include the DB connection file which initialises knex connection
const knex = require('./db/connection').knex;

// include our multi-pluck extension
require('./db/multi-pluck');

// example function to get data from DB using the extension
async function getData () {
return knex('product').limit(10).multiPluck('id', 'name');
}

// run the function
getData()
.then(pluckedResults => {
console.log(pluckedResults); // [[1, 'foo'], [2, 'bar'], [3, 'etc'], ...]
})
.catch(err => {
// handle errors as usual
});

请注意,QueryBuilder 扩展可以包含在连接初始化文件中,因此您可以在任何地方使用它们。

警告:由于 multiPluck 实际运行查询,它打破了 knex 查询链并且必须是查询中调用的最后一个函数

关于knex.js - 是否有等同于 knex.pluck() 的函数,它将返回多列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54896911/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com