Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql TypeForm:编辑具有自定义属性的多对多关系_Sql_Many To Many_Typeorm - Fatal编程技术网

Sql TypeForm:编辑具有自定义属性的多对多关系

Sql TypeForm:编辑具有自定义属性的多对多关系,sql,many-to-many,typeorm,Sql,Many To Many,Typeorm,如何编辑具有自定义属性的多对多关系的实体? Typeorm文档示例对于这种类型的关系非常有限: 我有3个表:用户、角色、用户角色 User.ts @实体(“用户”) 类用户{ @PrimaryGeneratedColumn(“增量”) id:编号; @第()列 名称:字符串; @第()列 电子邮件:字符串; @OneToMany(()=>UserRole,UserRole=>UserRole.user{ 答:是的, onDelete:'级联', onUpdate:'级联', }) @JoinC

如何编辑具有自定义属性的多对多关系的实体? Typeorm文档示例对于这种类型的关系非常有限:

我有3个表:用户、角色、用户角色

User.ts

@实体(“用户”)
类用户{
@PrimaryGeneratedColumn(“增量”)
id:编号;
@第()列
名称:字符串;
@第()列
电子邮件:字符串;
@OneToMany(()=>UserRole,UserRole=>UserRole.user{
答:是的,
onDelete:'级联',
onUpdate:'级联',
})
@JoinColumn({referencedColumnName:'user_id'})
用户角色!:用户角色[];
}
导出默认用户;
Role.ts

@实体(“角色”)
阶级角色{
@PrimaryGeneratedColumn(“增量”)
id:编号;
@第()列
角色:字符串;
@OneToMany(()=>UserRole,UserRole=>UserRole.role{
答:是的,
onDelete:'级联',
onUpdate:'级联',
})
@JoinColumn({referencedColumnName:'role_id'})
用户角色!:用户角色[];
}
导出默认角色;
UserRole.ts

@实体(“用户角色”)
类用户角色{
@PrimaryGeneratedColumn(“增量”)
id:编号;
@第()列
用户id!:编号;
@第()列
角色id!:编号;
@CreateDateColumn()
创建时间:日期;
@UpdateDateColumn()
更新日期:年月日;
@manytone(()=>User,User=>User.userRoles)
@JoinColumn({name:'user_id'})
用户!:用户;
@manytone(()=>Role,Role=>Role.userRoles)
@JoinColumn({name:'role_id'})
角色!:角色;
}
导出默认用户角色;
创建具有相关用户角色的用户正在工作:

const用户={
名称:“测试用户”,
电邮:'testuser@test.com',
用户角色:[
{role_id:1},
{role_id:2},
{role_id:3},
{role_id:4}
],
};
等待这个.usersRepository.save(用户);
更新它不工作,我想用新的角色替换所有相关的用户角色,在TypeForm多对多关系中是否有任何保存策略选项?我在其他ORM中见过,例如关系定义中的“replace”或“append”选项 这就是我试图更新的方式:

//加载用户
const user=wait this.usersRepository.findById(用户id);
/*
返回:
使用者{
id:2,
名称:“测试用户”,
电邮:'testuser@test.com',
用户角色:[
用户角色{
id:376,
用户id:2,
角色编号:1,
创建时间:2020-09-18T17:26:52.000Z,
更新时间:2020-09-18T17:26:52.000Z
},
用户角色{
身份证号码:377,
用户id:2,
角色编号:2,
创建时间:2020-09-18T17:26:52.000Z,
更新时间:2020-09-18T17:26:52.000Z
},
用户角色{
身份证号码:378,
用户id:2,
角色编号:3,
创建时间:2020-09-18T17:26:53.000Z,
更新时间:2020-09-18T17:26:53.000Z
},
用户角色{
身份证号码:379,
用户id:2,
角色编号:4,
创建时间:2020-09-18T17:26:53.000Z,
更新时间:2020-09-18T17:26:53.000Z
}
]
}
*/
//编辑用户
常数newRolesIds=[4,5,6,7];
user.name='更新的名称';
user.email=updatedemail@test.com';
//替换旧的用户角色并创建新的角色不是很好吗?
user.userRoles=newRolesIds.map(roleId=>{
//保留已保存在数据库中且位于newRolesIds中的角色
const existingRole=user.userRoles.find(userRole=>userRole.role\u id==roleId);
如果(现有角色){
返回现有角色;
}
//添加新角色
const userRole=new userRole();
userRole.user_id=user.id;
userRole.role_id=roleId;
返回用户角色;
});
/*
编辑后的用户:
使用者{
id:2,
名称:'更新名称',
电邮:'updatedemail@test.com',
用户角色:[
用户角色{user\u id:2,role\u id:4},
用户角色{user\u id:2,role\u id:5},
用户角色{user\u id:2,role\u id:6},
]
}
*/
this.ormRepository.save(用户);
保存失败,出现以下sql错误: 这是一个奇怪的更新sql,无法识别用户id,并且sql中甚至没有角色id,我是否忘记在关系中定义一些东西了

queryfailederor:无法添加或更新子行:外键约束失败(`user\u roles`,约束`UserRoleUserIdFK`外键(`user\u id`)在更新级联的删除级联上引用`users`(`id`))
代码:“ER_NO_REFERENCED_ROW_2”,
编号:1452,
sqlState:'23000',
sqlMessage:'无法添加或更新子行:外键约束失败(`user\u roles`,约束`UserRoleUserIdFK`外键(`user\u id`)在更新级联的删除级联上引用`users`(`id`)),
查询:“UPDATE`user\u roles`SET`user\u id`=?,`updated\u at`=当前时间戳,其中`id`=?”,
参数:[未定义,376]
sql日志显示新角色5、6、7的insert,之后它试图更新应删除的角色1、2、3,抛出sql错误

根据文档,只需从阵列中删除即可删除,还是手动删除?

query:从`user\u roles``user\u roles`中选择`user\u roles`.`id`作为`id`,`user\u roles`.`user\u id``作为`user\u id`作为`user\u id``的选项,其中(`user\u roles`.`user\u id`=?)--参数:[2]
查询:启动事务
查询:将值(默认值、、?默认值)插入到“用户角色”(`id`、`user\U id`、`role\U id`、`created\U at`)中--参数:[2,5]
查询:从“用户角色”中选择“用户角色”。“id”作为“用户角色”id,“用户角色”创建在“用户角色”创建在“用户角色”创建在“用户角色”,其中“用户角色”。“id”=?--参数:[7]
查询:将值(默认值、、?默认值)插入到“用户角色”(`id`、`user\U id`、`role\U id`、`created\U at`)中--参数:[2,6]
查询:从“用户角色”中选择“用户角色”。“id”作为“用户角色”id,“用户角色”创建在“用户角色”创建在“用户角色”创建在“用户角色”,其中“用户角色”。“id”=?--参数:[8]
查询:将值(默认值、、?默认值)插入到“用户角色”(`id`、`user\U id`、`role\U id`、`created\U at`)中--参数:[2,7]
查询:从“用户角色”中选择“用户角色”。“id”作为“用户角色”id,“用户角色”创建在“用户角色”创建在“用户角色”创建在“用户角色”,其中“用户角色”。“id”=?--参数:[9]
查询:更新`user\u roles`SET`user\u id`=?身份证在哪里