Как я могу искать по полю объединенной таблицы в graphql и nestjs - PullRequest
0 голосов
/ 04 октября 2019

Я создаю две таблицы тегов и 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. после этого запрос тега не включает информацию перевода тега ...

как я могу решить эту проблему? или есть другая идея ??

1 Ответ

0 голосов
/ 06 октября 2019

как я могу решить эту проблему? или есть другая идея ??

Отношения между сущностями должны быть разрешены на уровне полевого преобразователя (@ResolveProperty()), потому что когда кто-то запрашивает только id и type, вы все равно будете выполнять дополнительные, не требуется объединение в TagTranslation в запросе sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...