add base repository

This commit is contained in:
liuyi 2025-06-02 19:21:24 +08:00
parent 823046e94a
commit 68b06801d3
3 changed files with 18 additions and 15 deletions

View File

@ -1,21 +1,22 @@
import { Repository } from 'typeorm';
import { CommentEntity } from '@/modules/content/entities/comment.entity'; import { CommentEntity } from '@/modules/content/entities/comment.entity';
import { PostEntity } from '@/modules/content/entities/post.entity'; import { PostEntity } from '@/modules/content/entities/post.entity';
import { BaseRepository } from '@/modules/database/base/repository';
import { CustomRepository } from '@/modules/database/decorators/repository.decorator'; import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
@CustomRepository(PostEntity) @CustomRepository(PostEntity)
export class PostRepository extends Repository<PostEntity> { export class PostRepository extends BaseRepository<PostEntity> {
protected _qbName = 'post';
buildBaseQB() { buildBaseQB() {
return this.createQueryBuilder('post') return this.createQueryBuilder(this.qbName)
.leftJoinAndSelect('post.category', 'category') .leftJoinAndSelect(`${this.qbName}.category`, 'category')
.leftJoinAndSelect('post.tags', 'tags') .leftJoinAndSelect(`${this.qbName}.tags`, 'tags')
.addSelect((query) => { .addSelect((query) => {
return query return query
.select('COUNT(c.id)', 'count') .select('COUNT(c.id)', 'count')
.from(CommentEntity, 'c') .from(CommentEntity, 'c')
.where('c.post.id = post.id'); .where(`c.post.id = ${this.qbName}.id`);
}, 'commentCount') }, 'commentCount')
.loadRelationCountAndMap('post.commentCOunt', 'post.comments'); .loadRelationCountAndMap(`${this.qbName}.commentCOunt`, `${this.qbName}.comments`);
} }
} }

View File

@ -1,19 +1,21 @@
import { Repository } from 'typeorm';
import { PostEntity } from '@/modules/content/entities/post.entity'; import { PostEntity } from '@/modules/content/entities/post.entity';
import { TagEntity } from '@/modules/content/entities/tag.entity'; import { TagEntity } from '@/modules/content/entities/tag.entity';
import { CustomRepository } from '@/modules/database/decorators/repository.decorator'; import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
import { BaseRepository } from '../../database/base/repository';
@CustomRepository(TagEntity) @CustomRepository(TagEntity)
export class TagRepository extends Repository<TagEntity> { export class TagRepository extends BaseRepository<TagEntity> {
protected _qbName = 'tag';
buildBaseQB() { buildBaseQB() {
return this.createQueryBuilder('tag') return this.createQueryBuilder(this.qbName)
.leftJoinAndSelect('tag.posts', 'posts') .leftJoinAndSelect(`${this.qbName}.posts`, 'posts')
.addSelect( .addSelect(
(query) => query.select('COUNT(p.id)', 'count').from(PostEntity, 'p'), (query) => query.select('COUNT(p.id)', 'count').from(PostEntity, 'p'),
'postCount', 'postCount',
) )
.orderBy('postCount', 'DESC') .orderBy('postCount', 'DESC')
.loadRelationCountAndMap('tag.postCount', 'tag.posts'); .loadRelationCountAndMap(`${this.qbName}.postCount`, `${this.qbName}.posts`);
} }
} }

View File

@ -1,7 +1,7 @@
import { isArray, isNil } from 'lodash'; import { isArray, isNil } from 'lodash';
import { ObjectLiteral, SelectQueryBuilder } from 'typeorm'; import { ObjectLiteral, SelectQueryBuilder } from 'typeorm';
import { PaginateOptions, PaginateReturn } from '@/modules/database/types'; import { OrderQueryType, PaginateOptions, PaginateReturn } from '@/modules/database/types';
export const paginate = async <T extends ObjectLiteral>( export const paginate = async <T extends ObjectLiteral>(
qb: SelectQueryBuilder<T>, qb: SelectQueryBuilder<T>,