I am trying to get the books per user from the get request I have the following problem, it turns out that I am doing a many-to-many relationship but it indicates that the authors entity was not found, I have already searched the TypeORM documentation but I cannot find anything, this is my code:
book.controller.ts
x
@Controller('book')
export class BookController {
constructor(
private readonly _bookService: BookService
) { }
@Get('author/:authorId')
getBooksByAuthor(
@Param('authorId', ParseIntPipe) authorId: number,
): Promise<ReadBookDto[]> {
return this._bookService.getBooksByAuthor(authorId);
}
}
book.service.ts
@Injectable()
export class BookService {
constructor(
@InjectRepository(BookRepository)
private readonly _bookRepository: BookRepository,
@InjectRepository(UserRepository)
private readonly _userRepository: UserRepository
) { }
async getBooksByAuthor(authorId: number): Promise<ReadBookDto[]> {
const books: Book[] = await this._bookRepository.find({
// This is where I have the entity of authors, it should be noted that the entity of books if I have it
where: { status: status.ACTIVE, authors: In([authorId]) },
})
console.log(books)
return books.map(book => plainToClass(ReadBookDto, book));
}
}
book.entity.ts
import {
BaseEntity,
PrimaryGeneratedColumn,
Column,
ManyToMany,
Entity,
JoinColumn,
CreateDateColumn,
UpdateDateColumn,
} from 'typeorm';
import { User } from '../user/user.entity';
@Entity('books')
export class Book extends BaseEntity {
@PrimaryGeneratedColumn('increment')
id: number;
@Column({ type: 'varchar', length: 100, nullable: false })
name: string;
@Column({ type: 'varchar', length: 500 })
description: string;
@ManyToMany(type => User, user => user.books, { eager: true, primary: true})
@JoinColumn()
authors: User[];
@Column({ type: 'varchar', default: 'ACTIVE', length: 8 })
status: string;
@CreateDateColumn({ type: 'timestamp', name: 'created_at' })
createdAt: Date;
@UpdateDateColumn({ type: 'timestamp', name: 'updated_at' })
updatedAt: Date;
}
This is the user entity where I make the many to many relation user.entity.ts
@Entity('users')
export class User extends BaseEntity {
@PrimaryGeneratedColumn('increment')
id: number;
@Column({ type: 'varchar', unique: true, length: 25, nullable: false })
username: string;
@Column({ type: 'varchar', nullable: false })
email: string;
@Column({ type: 'varchar', nullable: false })
password: string;
@OneToOne(type => UserDetails, {
cascade: true,
nullable: false,
eager: true,
})
@JoinColumn({ name: 'detail_id' })
details: UserDetails;
@ManyToMany(type => Book, book => book.authors)
@JoinTable({ name: 'user_books' })
books: Book[];
}
If you could help me find the error it would be very helpful Thanks
Advertisement
Answer
You can use queryBuilder to get the books:
@Injectable()
export class BookService {
constructor(
@InjectRepository(BookRepository)
private readonly _bookRepository: BookRepository,
@InjectRepository(UserRepository)
private readonly _userRepository: UserRepository
) { }
async getBooksByAuthor(authorId: number): Promise<ReadBookDto[]> {
const books: Book[] = await this._bookRepository.createQueryBuilder('books')
.leftJoinAndSelect("books.authors", "users")
.where('books.status = :status',{status : status.ACTIVE})
.andWhere("users.id = :id ", { id: authorId })
.getMany();
console.log(books)
return books.map(book => plainToClass(ReadBookDto, book));
}
}