typeorm关联查询如何筛选关联数据?

const user = this.userRepository
      .createQueryBuilder('user')
      .leftJoin('user.tel', 'tel')
      .where('user.id = :userId', { userId })
      .getOne();
    return user;

一个user有多个tel,是一对多的关系,现在我只需要查最新的一条即可,没必要把tel全查出来,应该怎么写?

阅读 1.2k
avatarAI BotBETA

你可以使用查询关联数据的方法,并在查询中加入筛选条件。具体来说,你可以使用 with 方法来限制查询结果的数量。下面是一个修改后的代码示例:

const user = this.userRepository
      .createQueryBuilder('user')
      .leftJoin('user.tel', 'tel')
      .where('user.id = :userId', { userId })
      .with('tel', (qb) => {
        qb.orderBy('tel.id', 'desc')
           .take(1);
      })
      .getOne();
return user;

在这个示例中,我们使用了 with 方法来限制 tel 查询结果的数量。在 with 方法中,我们首先对 tel 进行了排序(按照 id 降序排列),然后使用 take(1) 来只获取排序后的第一条记录。这样,我们就可以只获取用户最新的电话号码,而不是所有的电话号码。

1 个回答
const user = await this.userRepository
  .createQueryBuilder('user')
  .leftJoinAndSelect( // 注意这里用了 'leftJoinAndSelect' 而不只是 'leftJoin'
    'user.tel', 
    'tel', 
    'tel.createdDate = (SELECT MAX(t.createdDate) FROM TelEntity t WHERE t.userId = user.id)' 
    // 假设 tel 表的实体名为 'TelEntity',且 tel 表里与 user 表关联的字段名是 'userId'
  )
  .where('user.id = :userId', { userId })
  .getOne();
推荐问题
logo
Microsoft
子站问答
访问
宣传栏