Я создаю игру про покемонов, чтобы попробовать 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
? И когда я пытаюсь упорствовать (последний код, чуть выше), он тоже не работает?