如何删除 TypeORM 和 Nest.js 中的嵌套实体
How to delete nested entities in TypeORM and Nest.js
我有一对多关系:
class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Phone, phone => phone.user, {cascade: true})
phones?: Phone[];
}
假设数据库中的当前数据如下:用户有两个 phone 号码:
{
"id": 1,
"name": "Jhon",
"phones": [
{"id": 1, "phone": "123456"},
{"id": 2, "phone": "567809"}
]
}
我构建了 UI(网络界面),我想从网络界面中删除用户配置文件中的 phone 号码。所以我这样做了,下面的 POST 请求来自 UI:第二个 phone 号码已删除
{
"id": 1,
"name": "Jhon",
"phones": [
{"id": 1, "phone": "123456"}
]
}
如何从数据库中删除 phone 号码 id=2?
我使用 Nest CRUD 模块,正如我从源代码中了解到的那样,它只是将来自请求的新数据与来自数据库的当前数据合并,因此将来自数据库的两个 phone 数字与来自请求的唯一 phone 数字合并给我们再次排列 phone 个数字,但没有删除任何内容:皱眉:
我试着手动做了,代码很多!
@Override()
async updateOne(
@ParsedRequest() req: CrudRequest,
@ParsedBody() dto: UpdateUserDto,
@Param('id') id: number,
): Promise<Shipment> {
// use standart Nest.js way to save new user data into database
await this.service.updateOne(req, dto);
// load fresh user data from database
const user = await this.service.findOne(id);
const phonesFromUi = dto.phones;
const phonesToBeDeleted = [];
// loop phone numbers from database - detect which to be deleted
user.phones.forEach((phoneFromDb) => {
const hasThisPhoneOnUi = phonesFromUi.find((phoneFromUi) => phoneFromUi.id === phoneFromDb.id);
if (!hasThisPhoneOnUi) {
// looks like this phone number was deleted on ui, so delete it from database too
phonesToBeDeleted.push(phoneFromDb);
}
});
// actually delete phone numbers from database
await this.connection.getRepositoryFor(Phone).remove(phonesToBeDeleted);
// reload fresh user data from database to get fresh list of phone numbers after delition some of them
const user = await this.service.findOne(id);
return user;
}
有没有办法通过 TypeORM 内置函数或方法来做到这一点?如何从嵌套数组中删除一些元素?
typeorm 对连接更新没有很好的支持,我建议你做的是接收 phones 参数并获取 select 与 UserId 相关的电话,然后删除不在新数组中的 ID:
const phones = await this.phoneRepository.find({userId:1});
const toDeletePhones = phones.filter((element)) => {
return updatePhones.indexOf(element) === -1;
}
this.phoneRepository.remove(toDeletePhones);
然后继续更新用户,或者您甚至可以在此之前完成
我有一对多关系:
class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Phone, phone => phone.user, {cascade: true})
phones?: Phone[];
}
假设数据库中的当前数据如下:用户有两个 phone 号码:
{
"id": 1,
"name": "Jhon",
"phones": [
{"id": 1, "phone": "123456"},
{"id": 2, "phone": "567809"}
]
}
我构建了 UI(网络界面),我想从网络界面中删除用户配置文件中的 phone 号码。所以我这样做了,下面的 POST 请求来自 UI:第二个 phone 号码已删除
{
"id": 1,
"name": "Jhon",
"phones": [
{"id": 1, "phone": "123456"}
]
}
如何从数据库中删除 phone 号码 id=2? 我使用 Nest CRUD 模块,正如我从源代码中了解到的那样,它只是将来自请求的新数据与来自数据库的当前数据合并,因此将来自数据库的两个 phone 数字与来自请求的唯一 phone 数字合并给我们再次排列 phone 个数字,但没有删除任何内容:皱眉: 我试着手动做了,代码很多!
@Override()
async updateOne(
@ParsedRequest() req: CrudRequest,
@ParsedBody() dto: UpdateUserDto,
@Param('id') id: number,
): Promise<Shipment> {
// use standart Nest.js way to save new user data into database
await this.service.updateOne(req, dto);
// load fresh user data from database
const user = await this.service.findOne(id);
const phonesFromUi = dto.phones;
const phonesToBeDeleted = [];
// loop phone numbers from database - detect which to be deleted
user.phones.forEach((phoneFromDb) => {
const hasThisPhoneOnUi = phonesFromUi.find((phoneFromUi) => phoneFromUi.id === phoneFromDb.id);
if (!hasThisPhoneOnUi) {
// looks like this phone number was deleted on ui, so delete it from database too
phonesToBeDeleted.push(phoneFromDb);
}
});
// actually delete phone numbers from database
await this.connection.getRepositoryFor(Phone).remove(phonesToBeDeleted);
// reload fresh user data from database to get fresh list of phone numbers after delition some of them
const user = await this.service.findOne(id);
return user;
}
有没有办法通过 TypeORM 内置函数或方法来做到这一点?如何从嵌套数组中删除一些元素?
typeorm 对连接更新没有很好的支持,我建议你做的是接收 phones 参数并获取 select 与 UserId 相关的电话,然后删除不在新数组中的 ID:
const phones = await this.phoneRepository.find({userId:1});
const toDeletePhones = phones.filter((element)) => {
return updatePhones.indexOf(element) === -1;
}
this.phoneRepository.remove(toDeletePhones);
然后继续更新用户,或者您甚至可以在此之前完成