Замена поля JSONB объекта на строку в TypeORM - PullRequest
0 голосов
/ 02 июля 2019

В моем проекте Nest.js у меня есть следующий шаблон в моих сущностях:

@Entity
class ArticleEntity {
    @PrimaryGeneratedColumn()
    id: number;

    @Column({type: 'jsonb'})
    title: {[locale: string]: string};
}

Затем я бы хотел вызвать метод извлечения с параметром locale и после загрузки запустить хук, который заменит объект в title строковым значением под переданным ключом locale. Я не знаю, как это сделать, потому что у меня нет опыта работы с хуками TypeORM, а также потому, что форма ArticleEntity уже определена классом, а поле title имеет тип {[locale: string]: string}, а не string.

Я делал это ранее в Sequelize, и это выглядело так:

// in Article
Article.beforeFind('chooseLocale', (options) => {
  const locale = options.locale || 'en';
  delete options.locale;
  if (locale !== 'any') {
    options.attributes = {
      exclude: ['title'],
      include: [
        [sequelize.literal(`"title" ->> '${locale}'`), 'title'],
      ]
    };
  }

  return options;
});

... хотя, очевидно, что JavaScript, а не TypeScript будет жаловаться на несоответствие типов:)

Я даже не уверен, должен ли я в TypeORM действительно использовать ловушку или какие-либо другие способы получения данных. Я хотел бы, чтобы все методы извлечения работали правильно. Есть ли способ?

...