Nestjs 如何使内部连接在typeform上工作?

Nestjs 如何使内部连接在typeform上工作?,nestjs,typeorm,Nestjs,Typeorm,我试图在TypeORM上构建一个简单的查询,但我并没有使用内部连接获取整个数据。我做错了什么 SQL查询运行得很好,但typeorm查询只返回“watcher”表的数据 SQL查询 SELECT * FROM watcher w INNER JOIN user ON w.userId = user.id; 打字形式 async getSystemWideWatchers(): Promise<any[]> { const query = this.createQueryBu

我试图在TypeORM上构建一个简单的查询,但我并没有使用内部连接获取整个数据。我做错了什么

SQL查询运行得很好,但typeorm查询只返回“watcher”表的数据

SQL查询

SELECT *
FROM watcher w
INNER JOIN user
ON w.userId = user.id;
打字形式

async getSystemWideWatchers(): Promise<any[]> {
    const query = this.createQueryBuilder('watcher');
    const result = await query.innerJoin('user', 'u', 'watcher.userId = u.id').getMany();
    console.log(result)
    return result;
}
异步getSystemWideWatchers():Promise{ const query=this.createQueryBuilder('watcher'); const result=wait query.innerJoin('user','u','watcher.userId=u.id').getMany(); console.log(结果) 返回结果; }
TypeORM有一个名为
innerjoin和select的方法。您可以使用普通的
innerJoin
。这就是为什么不从中选择用户表的原因

一旦您将该部件更改为
innerJoin并选择
,将从中选择监视表。但是,
getMany
getOne
返回实体类型的对象。因此,如果您的实体类型在用户表和观察者表之间没有关系,则所选列将不会包含在返回的对象中

在我向您展示如何添加这些关系之前,我想指出,您可以选择使用
getRawMany
函数来获取所有选定的列,但我不建议使用它,因为关系要整洁得多(没有原始列名,您会得到与关系对应的实体数组),在您的情况下,没有理由不使用关系

现在,按照我对数据库设计的理解,你有用户,用户有观察者。一个观察者只监视一个用户,可能有多个观察者监视同一个用户

在这种情况下,用户与观察者的关系称为“一对多”

观察者和用户之间的关系称为“多对一”

您需要在实体中指定此信息。这里有一个例子。请注意
OneToMany
decorator

@Entity()
导出类用户{
@主列()
id:编号;
@第()列
用户名:字符串;
@OneToMany(类型=>Watcher,Watcher=>Watcher.user)
观察者:观察者[];
}
以下是相应的观察者实体:

@Entity()
导出类监视程序{
@主列()
id:编号;
@第()列
watcherName:字符串;
//如果userId是一个外键,我们可以省略它(和连接条件)
@第()列
userId:number;
@manytone(类型=>User,用户=>User.watchers)
用户:用户;
}
一旦建立了这些关系,就可以选择一个用户及其所有观察者,反之亦然(选择一个观察者及其所观察的用户)

以下是您如何做到这两个方面:

//选择一个用户及其所有观察者
const query=createQueryBuilder('user','u')
.innerJoinAndSelect('u.watchers','w');/'w、 userId=u.id'可以省略
const result=await query.getMany();
(如您所知,如果您想包括没有观察者的用户,可以使用leftJoin而不是innerJoin。)

这可能是您最初试图做的:

//选择一个观察者和他们观察的用户
const query=createQueryBuilder('watcher','w')
.innerJoinAndSelect('w.user','u');/'w、 userId=u.id'可以省略
const result=await query.getMany();

以防有人遇到其他情况。补充Cem的回答。 如果数据库中没有定义关系,则可以执行以下操作:

const query = createQueryBuilder('user', 'u')    
.innerJoinAndMapMany(
    'u.ObjectNameToMapDataOn',
    EntityName,// or 'tableName'
    'IAmAlias',
    'u.columnName= IAmAlias.columnName'
  )

同样,也可以使用innerJoinAndMapOne。如果您希望有多个记录与联接表或单个记录,具体取决于您的情况。

Hey@Cem我尝试过,但什么也没有:(你可能没有必要的关系。我更新了我的答案。你能再检查一下吗?兄弟,你知道了!实体正是我拥有它的方式。问题是我试图使用
user.id
watcher.userId
而不是
watcher.user
。非常感谢你!新年快乐!啊-你有了但我没有使用它…我很高兴它被修复了,也祝你新年快乐!