TypeORM: @JoinTable с тремя столбцами - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть вопрос о typeorm и @ JoinTable - и @ RelationId -Декоратор.Может быть, кто-нибудь может помочь ответить на мой вопрос, дать подсказку или идеально решить мою проблему.

Я использую nestjs с typeorm, чтобы предоставить частный API с рецептами для моей семьи и меня.

Если я разрушу структуру базы данных до минимума, мы получим три основных объекта:

recipe
- id INT(11)
- name VARCHAR(255)
# PRIMARY KEY is id

ingredient
- id INT(11) // not autoincrement, fetched from https://www.programmableweb.com/api/chomp
- name VARCHAR(255)
- recipeId INT(11)
# PRIMARY KEY is a composite key (id, recipeId) 
# FOREIGN KEY is recipeId on recipe

step
- id INT(11)
- name VARCHAR(255)
- recipeId INT(11)
# PRIMARY KEY is id
# FOREIGN KEY is recipeId on recipe

Итак, это мои три основных объекта для моих рецептов.Рецепт может состоять из нескольких шагов ( много -шагов к- один -рецепт), а рецепт может иметь несколько ингредиентов ( много -ingredients-to- один рецепт)

Теперь сложная часть.Каждый шаг может иметь отношение к одному или нескольким ингредиентам.Это приводит к следующей таблице отношений.

ingredient_steps_step
- ingredientId INT(11)
- stepId INT(11)
- recipeId INT(11)
# PRIMARY KEY is a composite key (ingredientId, stepId, recipeId)
# FOREIGN KEYS are ingredientId on ingredient, stepId on step, recipeId on recipe

Мой ингридиент.entity.ts выглядит следующим образом:

@ManyToMany(type => Step, step => step.ingredients)
@JoinTable({
  name: 'ingredient_steps_step',
  joinColumns: [
    {name: 'ingredientId'},
    {name: 'recipeId'},
  ],
  inverseJoinColumns: [
    {name: 'stepId'},
  ],
})
steps: Step[];

@RelationId((ingredient: Ingredient) => ingredient.steps)
stepIds: number[];

@PrimaryColumn()
recipeId: number;

@PrimaryColumn()
id: number;

@ManyToOne(type => Recipe, recipe => recipe.ingredients)
recipe: Recipe;  

Проблема в том, что моя таблица ингредиентов заполнена, но таблица отношений ( component_steps_step ) не заполняется записями.Проблема в том, что нет такого декоратора, как @ RelationIds , где я могу предоставить два столбца для отношения к сущности step .

Было бы здорово, если бы кто-нибудь из вас мог помочь мне с этим.Может быть, необходимо предоставить вам больше информации о других организациях?

С уважением,

digitalhacke

1 Ответ

0 голосов
/ 26 февраля 2019

Каждое отношение должно быть в своей таблице.Если вы представите два отношения в одной таблице, вы создадите дублирование и, возможно, получите несоответствия.

Пример

Предположим, у вас есть рецепт MyRecipe с одним шагом Step1, который состоит из двух ингредиентов.Теперь вы хотите переместить Шаг 1 в другой рецепт OtherRecipe.Поскольку отношение MyRecipe <-> Step1 представляется дважды (дублирование), необходимо изменить несколько записей.Если вы забудете один из них, вы получите поврежденные данные.

ingredient_steps_step:
MyRecipe <-> Step1 <-> IngredientA
MyRecipe <-> Step1 <-> IngredientB

Я бы смоделировал данные следующим образом:

steps:
Step1 -> MyRecipe

step_ingredients:
Step1 <-> IngredientA
Step1 <-> IngredientB

Таким образом, вы не будетеесть дублирование.Я предполагаю, что ингредиенты рецепта - это объединение ингредиентов всех его шагов.

...