使用 Objection JS 如何使用 withGraphFetched 选择特定列

Posted

技术标签:

【中文标题】使用 Objection JS 如何使用 withGraphFetched 选择特定列【英文标题】:Using Objection JS How can I select specific columns with withGraphFetched 【发布时间】:2021-02-16 00:42:28 【问题描述】:

我有一个问题: 如何使用withGraphFetched 方法指示我想从数据库中获取哪些列,我有一个BelongsToOneRelation,我想排除一些列,这是我的模型:

module.exports = class ProveedorModel extends Model 

  ...

  static relationMappings = 
    empresa: 
      relation: Model.BelongsToOneRelation,
      modelClass: EmpresaModel,
      join: 
        from: 'proveedor.empresa_id',
        to: 'empresa.id'
      
    
  ;

  ...



在我的控制器中我有这个:

const payload = await ProveedorModel.query().withGraphFetched('empresa');

但是表empresa 有很多我不会的列,那么我该如何过滤?

【问题讨论】:

【参考方案1】:

您可以为您的关系指定filter 属性

class Person extends Model 
  static relationMappings = 
    pets: 
      relation: Model.OneToManyRelation,
      modelClass: Animal,
      filter: query => query.select('id', 'ownerId', 'name'),
      join: 
        from: 'Person.id',
        to: 'Animal.ownerId'
      
    
  

参考:https://github.com/Vincit/objection.js/issues/70#issuecomment-175143072

只是想知道为什么在使用 withGraphFetched 时,反对不只查询映射在 tableMetadata (https://vincit.github.io/objection.js/api/model/static-methods.html#static-tablemetadata) 中的列,就像它对 withGraphJoined 所做的那样

或者,您可以使用 parsedatabasejson 仅映射您想要的属性 (https://vincit.github.io/objection.js/api/model/instance-methods.html#parsedatabasejson) 但您的 SQL 查询将把它们全部带入。

【讨论】:

以上是关于使用 Objection JS 如何使用 withGraphFetched 选择特定列的主要内容,如果未能解决你的问题,请参考以下文章

使用 objection.js 或 knex.js 在 postgres 中的字符串列的 json 数组中查询

Objection.js 中的多对多关系

在Objection.js中,设置RelationMappings有什么好处?

Objection.js:所有 where 子句添加后是不是可以用括号括起来?

支持 ApolloServer 中的 Objection `$formatJson`

在 Objection.js 中按急切结果计数排序记录并实现分页?