描述
这里以一对一关系举例,通过 .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;
}