Как сохранить связь с TypeORM - PullRequest
0 голосов
/ 12 июля 2020

Я создаю игру про покемонов, чтобы попробовать TypeORM, но не могу сохранить подчиненное отношение.

У меня есть 3 объекта: AdventureLevel, AdventureTrainer & TrainerPokemon.

Имеется схема:

схема базы данных

Есть и другие отношения, но это не имеет значения.

Итак, AdventureLevel имеет одно AdventureTrainer, которое имеет много TrainerPokemon. (выглядит странно, потому что мои модели сущностей еще не sh)

Вот мои модели:

AdventureLevel

@Entity()
export class AdventureLevel {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToOne(() => AdventureTrainer, { nullable: false, cascade: true, eager: true })
  @JoinColumn()
  trainer: AdventureTrainer;

  @ManyToOne(() => Adventure, (adventure) => adventure.adventureLevel)
  adventure: Adventure;
}

AdventureTrainer

@Entity()
export class AdventureTrainer {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  src: string;

  @OneToMany(() => TrainerPokemon, (tp) => tp.adventureTrainer, { eager: true })
  pokemons: TrainerPokemon[];
}

TrainerPokemon

@Entity()
export class TrainerPokemon {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => PokemonModel, (pokemon) => pokemon.trainerPokemons)
  pokemonModel: PokemonModel;

  @ManyToOne(() => AdventureTrainer, (at) => at.pokemons)
  adventureTrainer: AdventureTrainer;

  @OneToMany(() => Move, (move) => move.trainerPokemons)
  moves: Move[];
}

И это мой метод контроллера, который сохраняется AdventureLevel

static create = async (req: Request, res: Response) => {
  const repository = getRepository(AdventureLevel);
  const { name, trainer, adventure } = req.body;
  const adventureLevel = new AdventureLevel();
  adventureLevel.name = name;
  adventureLevel.trainer = trainer;
  adventureLevel.adventure = adventure;
  
  const errors = await validate(adventureLevel);

  if (errors.length > 0) {
    res.status(400).json({ error: errors });
    return;
  }

  try {
    await repository.save(adventureLevel);
  } catch (e) {
    res.status(500).send();
    return;
  }
  res.status(201).send();
}

Я делаю запрос с этим телом:

{
    "name": "level name",
    "trainer": {
        "name": "Roger",
        "src": "fakeURL",
        "pokemons": [
            {
               "pokemonModel": { "id": 17 },
               "moves": [
                   {
                       "id": 1
                   }
               ] 
            }
        ]
    },
    "adventure": {
        "id": 1
    }
}

Текущее поведение

Уровень приключения сохраняется только в таблицах adventure_level и adventure_trainer. Таблица trainer_pokemon пуста.

Ожидаемое поведение

В trainer_pokemon таблице должна быть вставка:

id => AUTO INCREMENT
pokemonModelId => 17
AdventureTrainerId => ID of the created `AdventureTrainer`

Дополнительная информация

I Я пытался вставить себя в trainer_pokemon с помощью репозитория TrainerPokemon

let trainerPokemons: TrainerPokemon[] = [];
  
 for (const pokemon of adventureLevel.trainer.pokemons) {
  const trainerPokemon = new TrainerPokemon();
  trainerPokemon.pokemonModel = pokemon.pokemonModel;
  trainerPokemon.moves = pokemon.moves;
  trainerPokemons.push(trainerPokemon);
}
  
try {
  const savedAdventureLevel = await repository.save(adventureLevel);
  for (const trainerPokemon of trainerPokemons) {
    await trainerPokemonRepository.save({ ...trainerPokemon, adventureTrainer: { id: savedAdventureLevel.trainer.id } });
  }
}

Но он все равно ничего не вставил в trainer_pokemon.

NB: он выглядел как * Отношение 1072 * бесполезно и может быть прямо в AdventureLevel, но позже мне нужно будет разделить, поэтому я уже отделился.

Как лучше всего сохранить TrainerPokemon при создании нового AdventureLevel? И когда я пытаюсь упорствовать (последний код, чуть выше), он тоже не работает?

...