typeorm关联关系设置字段名称

描述

这里以一对一关系举例,通过 .leftJoinAndSelect() 函数左联查询

级联查询将自动将你的关联条件字段(外键字段)推测为 实体对象 + Id形式进行关联, 例如:

LEFT JOIN user_wallet wallet ON wallet.userId = user.id

除非我将表外键字段改成驼峰形式userId

以下过程可以直接跳过看解决部分

准备

表结构

-- 用户表
CREATE TABLE `user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名',
  
  PRIMARY KEY (`id`) USING BTREE
)

-- 用户钱包表
CREATE TABLE `user_wallet`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int NOT NULL COMMENT '用户ID',
  `balance` int NULL DEFAULT NULL COMMENT '余额',
  
  PRIMARY KEY (`id`) USING BTREE
) 

User实体

@Entity('user', { schema: 'test' })
export class User {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('varchar', { name: 'name', nullable: true, length: 255 })
  name: string | null;

  // 一对一关系
  @OneToOne(() => UserWallet, (userWallet) => userWallet.user)
  userWallet: UserWallet;
}

UserWallet实体

@Entity('user_wallet', { schema: 'test' })
export class UserWallet {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('int', { name: 'balance', nullable: true, comment: '余额' })
  balance: number | null;

  // 一对一关系
  @OneToOne(() => User, (user) => user.userWallet)
  @JoinColumn()
  user: User;
}

执行查询

const result = await this.userRepository
  .createQueryBuilder('user')
  .leftJoinAndSelect('user.userWallet', 'wallet')
  .getMany();

生成的sql语句

SELECT
	`user`.`id` AS `user_id`,
	`user`.`name` AS `user_name`,
	`wallet`.`id` AS `wallet_id`,
	`wallet`.`user_id` AS `wallet_user_id`,
	`wallet`.`balance` AS `wallet_balance`,
	`wallet`.`userId` AS `wallet_userId` 
FROM
	`user` `user`
	LEFT JOIN `user_wallet` `wallet` ON `wallet`.`userId` = `user`.`id`

可以看到left join 关系是通过 wallet.userId 字段与 user.id 进行关联的, 但是我表使用的是 user_id

typeorm无法知道你的外键字段具体叫什么名字,且我不想将表外键字段改成驼峰形式userId

解决

指定关联列的字段名称

@JoinColumn({ name: ‘user_id’ })

@Entity('user_wallet', { schema: 'test' })
export class UserWallet {
  @Column('int', { primary: true, name: 'id' })
  id: number;

  @Column('int', { name: 'balance', nullable: true, comment: '余额' })
  balance: number | null;

  // 一对一关系
  @OneToOne(() => User, (user) => user.userWallet)
  @JoinColumn({ name: 'user_id' })
  user: User;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值