@gabrielac9

Как правильно установить отношение one-to-many relationship и обеспечить эффективную функциональность операции orderBy?

столкнулась с трудностями при работе с отношениями в PostgreSQL.

Мой стек: Nestjs, typeorm, postgres.

У меня есть две сущности: 'category' и 'categoryTranslation'. Очевидно, что 'categoryTranslation' служит для хранения переводов категорий и является важной частью многоязычной функциональности. Эти сущности разработаны с учетом простоты.

@Entity({ name: 'category' })
export class CategoryEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar')
  name: string;

  @Column('varchar')
  description: string;

  @OneToMany(
    _type => CategoryTranslationEntity,
    categoryTranslation => categoryTranslation.category,
  )
  categoryTranslation: CategoryTranslationEntity[];
}

@Entity({ name: 'category_translation' })
export class CategoryTranslationEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar')
  name: string;

  @Column('varchar')
  description: string;

  @Column('integer', { name: 'language_id' })
  languageId: number;

  @Column('integer', { name: 'category_id' })
  categoryId: number;

  @ManyToOne(_type => CategoryEntity, category => category.id, {
    onDelete: 'CASCADE',
  })
  @JoinColumn({ name: 'category_id' })
  category: CategoryEntity;
}


Как видно из структуры, сущность "categoryTranslation" отражает поля сущности "category", подлежащие переводу. Более того, она включает в себя дополнительные атрибуты languageId и categoryId, где categoryId служит в качестве ссылки.

Моим намерением было инициировать запрос с фронтенда для получения списка категорий. Я отправляю параметр languageId в заголовке, после чего выполняю операцию innerJoin и select с условием (которое, я признаю, может быть не совсем точным). После этого я получаю данные в следующем формате:

CategoryEntity {
        id: 65,
        name: 'Pumpkin pie',
        description: 'Description for Pumpkin pie',
        categoryTranslation: [ [CategoryTranslationEntity] ]
      },
      CategoryEntity {
        id: 72,
        name: 'Pickles',
        description: 'Description for Pickles',
        categoryTranslation: [ [CategoryTranslationEntity] ]
      }


Перед отправкой данных обратно на фронтенд, я использую функцию map, которая заменяет атрибуты name и description сущности 'categoryEntity' на соответствующие атрибуты объекта 'categoryTranslationEntity'. В случаях, когда перевод отсутствует в 'categoryTranslation' или остается пустым, я сохраняю английский перевод в качестве запасного варианта.

Текущая проблема, с которой я сталкиваюсь, связана с трудностями в работе с функциональностями orderBy и textFilter. С моего понимания, использование операции innerJoin и выборки с третьим аргументом в качестве условия может привести к неожиданному поведению, что, как я понимаю, и происходит в моей ситуации. Исходя из этого контекста и понимания общей ситуации и кодовой базы, вы могли бы предоставить рекомендации по более эффективным стратегиям для управления моими сущностями перевода?
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы