Nest typeorm作分页查询(总条数、总页数、当前页、每页条数、模糊搜索、非空判断、联表查询) |
您所在的位置:网站首页 › uniapp推送jpush › Nest typeorm作分页查询(总条数、总页数、当前页、每页条数、模糊搜索、非空判断、联表查询) |
需求
基本的表格操作,包括表的分页、模糊查询、联表查询、总数统计等。 一、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 |