我如何在graphql和nestjs中按联接表的字段进行搜索

问题描述 投票:0回答:1

i创建两个表tag和tagTranslation。以下是各领域

Tag
id, type, transloations, creaed_at, updated_at

TagTranslation
id, tag_id, name, language

我使用graphql,我想按类型,名称和语言获取标签列表

{ tags(name:"tag1", language:"en, type:3){
    id,
    type,
    translations{
      id,
      name,
      language,
    }
}
}

所以我创建如下的解析器

@Query(returns => [Tag])
tags(@Args() tagArgs: TagArgs): Promise<Tag[]> {

    const where = {
        ...(tagArgs.type) && {type: tagArgs.type}
    };

    const include_where = {
        ...(tagArgs.name) && {name: { [Op.like]: `%${tagArgs.name}%` }},
        ...(tagArgs.language) && {language: tagArgs.language}
    };

    return this.tagService.findAll({
        where: where,
        include: {
            as: 'translations',
            model: TagTranslation,
            where: include_where,
            required: true,
        }
    });
}

@Query(returns => Tag)
tag(@Args({name: 'id', type: ()=> Int}) id: number): Promise<Tag>{
    return this.tagService.get(id)
}

@ResolveProperty()
async translations(@Parent() tag): Promise<TagTranslation[]>{
    const { id } = tag;
    return await this.tagTranslationService.findAll({tag_id: id});

}

当我调用标签时,查询被调用两次

首先,执行查询以获取所需的结果。

但第二,

SELECT `id`, `tag_id`, `name`, `language`, `created_at`, `updated_at` FROM `tag_translation` AS `TagTranslation` WHERE `TagTranslation`.`tag_id` = 1;

再次调用查询,所以我无法获得想要的结果。

我认为由于ResolveProperty而调用第二个查询,因此我删除了ResolveProperty。之后,标签查询不包含标签翻译信息...

我该如何解决这个问题?还是还有其他想法?

graphql nestjs type-graphql
1个回答
0
投票

我该如何解决这个问题?还是还有其他想法?

实体之间的关系应该在字段解析器(@ResolveProperty())级别上解析,因为当某人仅请求idtype时,您仍将在SQL查询中的TagTranslation上执行其他不需要的联接。

© www.soinside.com 2019 - 2024. All rights reserved.