TypeORM 有一个名为innerJoinAndSelect 的方法。你使用普通的innerJoin。这就是为什么没有从中选择用户表的原因。
将该部分更改为innerJoinAndSelect 后,将从中选择监视表。但是,getMany 和 getOne 返回具有您的 Entity 类型的对象。因此,如果您的 Entity 类型没有 User 和 Watcher 表之间的关系,则所选列将不会包含在返回的对象中。
在我向您展示如何添加这些关系之前,我想提一下您可以选择使用getRawMany 函数来获取所有选定的列,但我不建议使用它,因为关系更整洁(没有原始列名,您将获得与关系相对应的实体数组),在您的情况下,没有理由不使用关系。
现在,我理解您的数据库设计的方式是,您有用户,而用户有观察者。一个 Watcher 只关注一个 User,可能有多个 Watcher 关注同一个用户。
在这种情况下,用户与观察者的关系称为“一对多”。
Watcher 与 User 的关系称为“多对一”。
您需要在您的实体中指定此信息。这是一个例子。注意 OneToMany 装饰器。
@Entity()
export class User {
@PrimaryColumn()
id: number;
@Column()
userName: string;
@OneToMany(type => Watcher, watcher => watcher.user)
watchers: Watcher[];
}
这里是对应的Watcher Entity:
@Entity()
export class Watcher {
@PrimaryColumn()
id: number;
@Column()
watcherName: string;
// we can omit this (and the join condition), if userId is a foreign key
@Column()
userId: number;
@ManyToOne(type => User, user => user.watchers)
user: User;
}
建立这些关系后,您可以选择一个用户及其所有观察者,反之亦然(选择一个观察者及其观察的用户)。
这两种方法都是这样的:
// Select a user and all their watchers
const query = createQueryBuilder('user', 'u')
.innerJoinAndSelect('u.watchers', 'w'); // 'w.userId = u.id' may be omitted
const result = await query.getMany();
(如果您想包含没有观察者的用户,您可能知道使用 leftJoin 而不是 innerJoin。)
这可能是您最初尝试做的事情:
// Select a watcher and the user they watch
const query = createQueryBuilder('watcher', 'w')
.innerJoinAndSelect('w.user', 'u'); // 'w.userId = u.id' may be omitted
const result = await query.getMany();