ppetzold / nestjs-paginate

Pagination and filtering helper method for TypeORM repositories or query builders using Nest.js framework :book::paperclip:
MIT License
428 stars 93 forks source link

Cannot load relations with multiple select properties #517

Closed art1c0 closed 1 year ago

art1c0 commented 1 year ago

If using parameter select with value plans- it works as expected by loading payor entity with plans relation. If using it with value id,plans - error column payor.plans does not exist. If using it with value id, plans (with a space after the comma) - error column distinctAlias.payor_name does not exist.

ppetzold commented 1 year ago

what package version and db driver are you using?

art1c0 commented 1 year ago

version 4.12.1, postgresql

ppetzold commented 1 year ago

can you submit a PR with a test case showing the problem?

art1c0 commented 1 year ago

no, sorry, i don't use the package anymore - it has too many bugs... i wrote similar myself in a few hours.

gylove1994 commented 8 months ago

Seem I have a similar problem.

import { CreateDateColumn, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';

export class BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @CreateDateColumn({
    type: 'timestamp',
    default: () => 'CURRENT_TIMESTAMP(6)',
  })
  createdAt: Date;

  @UpdateDateColumn({
    type: 'timestamp',
    default: () => 'CURRENT_TIMESTAMP(6)',
    onUpdate: 'CURRENT_TIMESTAMP(6)',
  })
  updatedAt: Date;
}
import { PaginateConfig } from 'nestjs-paginate';
import { UserEntity } from '../entities/user.entity';

export const PAGINATE_USER_CONFIG: PaginateConfig<UserEntity> = {
  relations: ['roles'],
  select: [
    'id',
    'phone',
    'email',
    'createdAt',
    'updatedAt',
    'emailValidated',
    'phoneValidated',
    'avatar',
    'realName',
    'username',
    'status',
    'roles',
  ],
  sortableColumns: ['createdAt', 'updatedAt'],
};
import { BaseEntity } from 'src/common/entities/base.entity';
import { UserStatusEnum } from 'src/common/enums/user-status.enums';
import { RoleEntity } from 'src/role/entities/role.entity';
import { Column, Entity, Index, JoinTable, ManyToMany, PrimaryGeneratedColumn } from 'typeorm';

@Index(['email', 'phone', 'id'])
@Entity('user')
export class UserEntity extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({
    default: '未命名用户',
  })
  username: string;

  @Column({
    nullable: true,
  })
  realName?: string;

  @Column()
  password: string;

  @Column({
    nullable: true,
    unique: true,
  })
  email?: string;

  @Column({
    unique: true,
  })
  phone: string;

  @Column({
    nullable: true,
  })
  weChatId?: string;

  @Column({
    nullable: true,
  })
  avatar?: string;

  @Column({
    type: 'enum',
    default: UserStatusEnum.notActivated,
    enum: UserStatusEnum,
  })
  status: UserStatusEnum;

  @Column({
    default: false,
  })
  phoneValidated: boolean;

  @Column({
    default: false,
  })
  emailValidated: boolean;

  @JoinTable()
  @ManyToMany(() => RoleEntity, (roleEntity) => roleEntity.users, {
    cascade: true,
  })
  roles: RoleEntity[];
}
import { BaseEntity } from 'src/common/entities/base.entity';
import { PermissionEntity } from 'src/permission/entities/permission.entity';
import { UserEntity } from 'src/user/entities/user.entity';
import { Column, Entity, Index, JoinTable, ManyToMany, ManyToOne } from 'typeorm';

@Entity('role')
@Index(['id'])
export class RoleEntity extends BaseEntity {
  @Column({
    unique: true,
  })
  name: string;

  @Column({
    nullable: true,
  })
  description?: string;

  @Column({
    default: true,
  })
  editable: boolean;

  @ManyToMany(() => UserEntity, (user) => user.roles)
  users: UserEntity[];

  @JoinTable()
  @ManyToMany(() => PermissionEntity, (permission) => permission.roles)
  permissions: PermissionEntity[];
}

  @Get()
  @ApiOperation({ summary: '获取所有用户' })
  @PaginatedSwaggerDocs(UserEntity, PAGINATE_USER_CONFIG)
  async findAll(@Paginate() query: PaginateQuery) {
    return await this.userService.findAll(query);
  }

  async findAll(query: PaginateQuery) {
    return paginate(query, this.userEntityRepository, PAGINATE_USER_CONFIG);
  }
image image
{
    "nestjs-paginate": "^8.6.0",
    "@nestjs/typeorm": "^10.0.1",
    "pg": "^8.11.3",
}

pgsql: postgres:16

gylove1994 commented 8 months ago

@ppetzold may reopen this?

ppetzold commented 8 months ago

@gylove1994 can just ask you the same - could you open a PR with a test showcasing the problem?

gylove1994 commented 8 months ago

ok, i will try.

gylove1994 commented 8 months ago

@ppetzold added.

image