Nest typeorm作分页查询(总条数、总页数、当前页、每页条数、模糊搜索、非空判断、联表查询)

您所在的位置:网站首页 uniapp推送jpush Nest typeorm作分页查询(总条数、总页数、当前页、每页条数、模糊搜索、非空判断、联表查询)

Nest typeorm作分页查询(总条数、总页数、当前页、每页条数、模糊搜索、非空判断、联表查询)

2023-03-14 23:19| 来源: 网络整理| 查看: 265

需求

基本的表格操作,包括表的分页、模糊查询、联表查询、总数统计等。

一、Controller层 @Get('list') // 传入当前页,每页查询的条数,用户列表的username 和 nickname字段 和角色列表的role字段 getAllUser( @Query('current', ParseIntPipe) current, @Query('size', ParseIntPipe) size, @Query('username') username, @Query('nickname') nickname, @Query('role') role) { return this.userService.findAll(current,size, username, nickname,role); } 二、Service层 分页简介:

.take(10)

返回前 10 条数据

.skip(10)

除前10条以外的所有数据

两者想互搭配即可作分页,假设每页数据固定展示10条,现想查询第二页的数据(11-20),故查询语句应为:

.skip(10) .take(10) 模糊查询和非空查询

现需要对Controller层传入的username进行模糊搜索和非空处理,若传入字段为空,则不进行模糊匹配,非空判断需引入Brackets(typeorm中引入)

使用Brackets将复杂的WHERE表达式添加到现有的WHERE

.where( new Brackets((qb) => { // 值不为空,进行模糊搜索 if (username) { return qb.where('user.username LIKE :username', { username: `%${username}%`, }); } else { return qb; } }), ) 多对多联表查询,并对角色字段进行模糊搜索和非空判断。

User 实体类:

@ManyToMany((type) => Role, (role) => role.users) roles: Role[];

Role:

@Column({ length: 500, comment: '角色名称' }) name: string; @ManyToMany(() => User, (user) => user.roles) @JoinTable() users: User[];

Service层代码

.leftJoinAndSelect('user.roles', 'role') .where( new Brackets((qb) => { if (role) { return qb.andWhere('role.name LIKE :role', { role: `%${role}%`, }); } else { return qb; } }), )

全部代码:

// 获取全部用户 async findAll( current: number, size: number, username: string, nickname: string, role: string, ) { // 查询表的总条数 let totalUser = await this.userRepository .createQueryBuilder('user') .leftJoinAndSelect('user.roles', 'role') .select('count(user.id)', 'total') .where( new Brackets((qb) => { // 值不为空,进行模糊搜索 if (username) { return qb.where('user.username LIKE :username', { username: `%${username}%`, }); } else { return qb; } }), ) .andWhere( new Brackets((qb) => { if (nickname) { return qb.andWhere('user.nickname LIKE :nickname', { nickname: `%${nickname}%`, }); } else { return qb; } }), ) .andWhere( new Brackets((qb) => { if (role) { return qb.andWhere('role.name LIKE :role', { role: `%${role}%`, }); } else { return qb; } }), ) .getRawMany(); // string转number let total = Number(totalUser[0].total); let list = []; let pages = Math.ceil(total / size); // 大于0时,才进行查询,避免资源消耗 if (total > 0) { // 当前页小于总页数时,对表进行分页 if (current if (username) { return qb.where('user.username LIKE :username', { username: `%${username}%`, }); } else { return qb; } }), ) .andWhere( new Brackets((qb) => { if (nickname) { return qb.andWhere('user.nickname LIKE :nickname', { nickname: `%${nickname}%`, }); } else { return qb; } }), ) .andWhere( new Brackets((qb) => { if (role) { return qb.andWhere('role.name LIKE :role', { role: `%${role}%`, }); } else { return qb; } }), ) .skip((current - 1) * size) .take(size) .getMany()) as any; list.forEach((e) => (e.roles = e.roles.map((e) => e.name).toString())); } } return { list, total, size, current, pages, }; }

此处查询总条数使用getRawMany()而不是getMany()

使用选择查询构建器可以获得两种类型的结果:entities 和 raw results。 大多数情况下,你只需要从数据库中选择真实实体,例如 users。 为此,你可以使用getOne和getMany。 但是,有时需要选择特定数据,例如 sum of all user photos。 这些数据不是实体,它被称为原始数据。 要获取原始数据,请使用getRawOne和getRawMany。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3