如何在 BookshelfJS 的查询中使用 ID?

How to use ID in Query in BookshelfJS?

我有一个字段,它有 逗号分隔的 ID,所以我想从所选的 ID 中查找,这是我的代码,

.get(function(req, res) {
  knex.select('*')
  .from('exam')
  .whereRaw('? = any(regexp_split_to_array(student_id))', [req.params.id])
  .then(function(rows) {
    //return res.send(rows);
    console.log(rows);
  })
  .catch(function(error) {
    console.log(error)
  });
});

===> 当我使用 KNEX 它会给出这样的错误,

{ error: function regexp_split_to_array(text) does not exist
  name: 'error',
  length: 220,
  severity: 'ERROR',
  code: '42883',
  detail: undefined,
  hint: 'No function matches the given name and argument types. You might need to add explicit type casts.',
  position: '37',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'parse_func.c',
  line: '523',
  routine: 'ParseFuncOrColumn' 
}
  1. student_id列我有这样的ID,33,34,35,36
  2. req.params.id 我只有一个 ID,比如 35.
  3. 所以我想要包含 35 个 ID 的 ,相同 Table.

===> 所以我只想要两行 (2,3) 因为它包含 ID = 35.

假设您使用的是 PostgreSQL 数据库(我在屏幕截图上看到您使用的是 phpPgAdmin)。您可以使用 regexp_split_to_array 函数将字符串转换为数组(显然 :)。并使用 any.

对结果数组执行搜索

在SQL个字里,可以这样写

select '35' = any(regexp_split_to_array('33,34,35,36', E','));

在您的查询中,您可以将 .where 替换为

.whereRaw("? = any(regexp_split_to_array(student_id, E','))", [req.params.id])

但请记住,这可以是 performance-heavy 请求,对于您执行字符串拆分操作的每一行。一种更好的方法(假设您的项目有必要在一行中包含数组值)是将 student_id 存储在 Array 类型中并添加 gin index on student_id column and perform search operations like this

select * from table where student_id @> '{35}';