Как сохранить отношение в @ManyToMany в typeORM
Есть 2 объекта с именем Article
а также Classification
, И отношение их @ManyToMany
,
Вот мой вопрос: как сохранить отношения?
Мой код, как показано ниже:
@Entity()
export class Article {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@CreateDateColumn()
createTime: Date;
@UpdateDateColumn()
updateTime: Date;
@Column({
type: 'text',
})
content: string;
@Column({
default: 0,
})
likeAmount: number;
@Column({
default: 0,
})
commentAmount: number;
}
@Entity()
export class Classification {
@PrimaryGeneratedColumn()
id: number;
@CreateDateColumn()
createTime: Date;
@UpdateDateColumn()
updateTime: Date;
@Column()
name: string;
@ManyToMany(type => Article)
@JoinTable()
articles: Article[];
}
Я могу спасти Article
а также Classification
успешный. Но я не уверен, как сохранить их отношения.
Я попытался сохранить отношение с помощью кода ниже:
async create(dto: ArticleClassificationDto): Promise<any> {
const article = this.repository.save(dto);
article.then(value => {
console.log(value);//console the object article
value.classification.forEach(item => {
const classification = new Classification();
classification.id = item.id;
classification.articles = [];
classification.articles.push(value);
this.classificationService.save(classification);
})
});
console.log(article);
return null;
}
И структура данных поста, как это
{
"name":"artile name",
"content":"article content",
"classification":[{
"id":4
},{
"id":3
}]
}
В начале это работает.
Но когда я снова публикую данные, старая запись была заменена, скорее создайте другую запись.
Что я должен делать дальше?
Просто посмотрите код ниже, пожалуйста.
async create(dto: ArticleClassificationDto): Promise<any> {
this.repository.save(dto).then(article => {
article.classification.forEach(item => {
this.ClassificationRepository.findOne(
{
// the privous method is get all the articles from databse and push into this array
// relations: ['articles'],
where: { id: item }// now I change the data strcture, just contains id instead of {id}
}
).then(classification => {
// console.log(article);
console.log(classification);
// cmd will show ' UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'push' of undefined' withous below line code. But if I init the array manually,the old record will be replaced again.
// classification.articles = [];
classification.articles.push(article);
this.ClassificationRepository.save(classification);
});
})
})
return null;
}
2 ответа
Как сохранить отношения?
Предположим, у вас есть массив статей, и вы хотите создать отношение к объекту классификации. Вы просто назначаете массив для свойства articles
и сохранить сущность; typeorm автоматически создаст отношение.
classification.articles = [article1, article2];
await this.classificationRepository.save(classification);
Чтобы это работало, сущности товара должны быть уже сохранены. Если вы хотите, чтобы typeorm автоматически сохранял сущности статьи, вы можете установить cascade
в true
,
@ManyToMany(type => Article, article => article.classifications, { cascade: true })
Ваш пример
async create(dto: ArticleClassificationDto): Promise<any> {
let article = await this.repository.create(dto);
article = await this.repository.save(article);
const classifications = await this.classificationRepository.findByIds(article.classification, {relations: ['articles']});
for (const classification of classifications) {
classification.articles.push(article);
}
return this.classificationRepository.save(classifications);
}
в моем случае у меня есть пользователь и роль, сначала вам нужно инициализировать свой manytomany в своих объектах:
в пользовательском объекте:
@ManyToMany((type) => Role, {
cascade: true,
})
@JoinTable({
name: "users_roles",
joinColumn: { name: "userId", referencedColumnName: "id" },
inverseJoinColumn: { name: "roleId" }
})
roles: Role[];
в ролевой сущности:
//Many-to-many relation with user
@ManyToMany((type) => User, (user) => user.roles)
users: User[];
в своей службе я создаю новую сущность из своих данных, а затем добавляю данные роли в свой новый объект сущности:
let entity = await this.userRepository.create(data);
let entity2 = {
...entity,
roles: data.selectedRoles,
};
const user = await this.userRepository.save(entity2);
это пример на сайте веб-typeorm :
const category1 = new Category();
category1.name = "animals";
await connection.manager.save(category1);
const category2 = new Category();
category2.name = "zoo";
await connection.manager.save(category2);
const question = new Question();
question.title = "dogs";
question.text = "who let the dogs out?";
question.categories = [category1, category2];
await connection.manager.save(question);