【问题标题】:How to exclude a column from typeorm entity and could be optional to get the column using Find method如何从 typeorm 实体中排除列,并且可以选择使用 Find 方法获取列
【发布时间】:2021-10-11 21:04:34
【问题描述】:
import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class User {

@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@Column()
password: string;
}

我不想在这里输入密码,因为我想返回给客户:

const user = await User.find({where:{name:"test"}})

当我想修改密码时,我需要密码:

const user = await User.findOne({where:{name:"test"}})
user.password="password";
await user.save()

有 Find、FindAndCount 甚至 FindOne 方法的解决方案吗?

我该怎么办?

【问题讨论】:

    标签: typescript postgresql nestjs typeorm


    【解决方案1】:

    您可以在实体内的@Column 装饰器中添加一个选择选项,如下所示:

    import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";
    
    @Entity()
    export class User {
    
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      name: string;
    
      @Column({select: false})
      password: string;
    }
    

    这样,如果您执行find,您将不会从模型中获取密码字段。您必须使用QueryBuilder 明确地执行addSelect

    参考:https://typeorm.io/#/select-query-builder/hidden-columns

    【讨论】:

    • 感谢您的回答。是否可以将 Find Method 的参数传递给 createQueryBuilder().where(args) ?因为我写了一些用于动态排序和过滤的功能 Find Method's Options。 @rahul-sharma
    • findQueryBuillderwhere 以不同的方式接受参数。我想在createQueryBuilder().where 中传递你为find 编写的json 是不可能的。您始终可以编写使用findQueryBuilder 编写的任何查询。您必须在where 中指定过滤器并使用sort 方法进行排序。
    • 是的,完全正确,我终于在从数据库中获取所有字段后,从技术上使用 RXJS 的 map 运算符从 Find() 中返回的数组中删除密码字段
    【解决方案2】:

    如果您不想将select: false 应用于实体中的列,那么其他选项是仅在您需要的查找方法中选择性地键入列

    this.ManagementUnitRepository.find({
      select: ["id", "name"]
    });
    

    【讨论】:

    • 感谢您的解决方案@Awais Nasir
    猜你喜欢
    • 2020-10-02
    • 2020-06-17
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多