Search code examples
nestjstypeorm

Typeorm cannot create relations between tables


Have got error 'Cannot read properties of undefined (reading 'joinColumns')' How to implement: user can have only one assigned role with permissions to resources?

I used sequilize before, in typeorm I'm newbee

user_roles table entity:

@Entity({ name: 'user_roles' })
export class UserRoleEnitity extends DateAudit implements IUserRole {
    @Column('varchar')
    name: string;

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

    @Column('boolean', {
        name: 'is_active',
        default: false
    })
    isActive?: boolean; 

    @OneToMany(() => RolePermissionsEnitity, permission => permission.id)
    permissions: IUserRolePermission[];
}

and users entity:

@Entity({ name: 'users' })
export class UserEnitity extends DateAudit implements IUser {
    @JoinColumn({ name: 'role_id' }) 
    roleId: string;

    @OneToMany(() => UserRoleEnitity, role => role.id)
    role: UserRoleEnitity;
  
    @Column('varchar', {
        unique: true,
    })
    username: string;
  
    @Column('varchar')
    password: string;

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

    @Column('varchar', {
        name: 'mobile_number',
        nullable: true,
    })
    modileNumber?: string;

    @Column('varchar', {
        nullable: true,
    })
    name?: string;

    @Column('varchar', {
        nullable: true
    })
    position?: string;

    @Column({
        name: 'is_verified',
        default: true
    })
    isVerified?: boolean;

    @Column('timestamp', {
        name: 'password_modified_at',
        default: new Date()
    })
    passwordModifiedAt?: Date;
}

and role_permissions

@Entity({ name: 'user_role_permissions' })
export class RolePermissionsEnitity extends DateAudit implements IUserRolePermission {
    @JoinColumn({ name: 'role_id' }) 
    roleId: string;

    @ManyToOne(() => UserRoleEnitity)
    role: IUserRole;

    @Column({
        type: 'enum',
        enum: Actions,
        default: Actions.READ
    })
    action: Actions;

    @JoinColumn({ name: 'resource_id' }) 
    resourceId: string;

    @ManyToOne(() => ResourceEntity, resource => resource.id)
    resource: IResource;
}

When i query repository like this:

const userEntity = await this._userRepository.findOne({
            where: {
                username,
            },
            relations: ['role']
});

Solution

  • Your parent entity should not refer to an ID, you should have a relation to a field that defines your user entity. like this :

    UsersRoleEntity

    @OneToMany(() => RolePermissionsEnitity, permission => permission.role)
    permissions: IUserRolePermission[];
    

    UsersEntity

    @OneToMany(() => UserRoleEnitity, role => role.id)
    role: UserRoleEnitity;
    

    You don't need to use JoinColumn() in ManyToOne and OneToMany relations.

    You can find more information here:

    TypeORM Relations Documentation