我有多个用户和组关联,然后删除我正在使用的用户中使用的组:
DBALException:执行'DELETE FROM时发生异常 群组WHERE id =?'与params ...完整性约束违规: 1451无法删除或更新父行:外键约束 失败...
DBALException:执行'DELETE FROM时发生异常 群组WHERE id =?'与params ...完整性约束违规: 1451无法删除或更新父行:外键约束 失败
... 这是正常的,我怎么能捕捉异常,或检查它是否以某种方式使用?
答案 0 :(得分:0)
这意味着您可能已使用外键设置数据库,如下所示:
|---------|
| User |
|---------|
| id |
| groupId |
|---------|
|-------|
| Group |
|-------|
| id |
|-------|
User.groupId
指的是Group.id
。这意味着当您删除组时,您需要定义数据库应该对属于该组的用户执行的操作。
根据您的意图,可以更改外键约束来处理这种情况。您没有提到您正在使用的数据库类型,但我知道在MySQL中您可以拥有CONSTRAINT
ON DELETE
子句,并为其选择RESTRICT
(默认,您现在看到的内容),CASCADE
(删除与该群组相关联的所有用户)和SET NULL
(将groupId
设置为NULL
,以清除其群组的用户)。
答案 1 :(得分:0)
除了在数据库级别使用ON DELETE
子句(这显然是优雅且与框架无关的方式)之外,您可能希望直接在代码中检查该组的现有用户。在这种情况下,您可以执行另一个查询。
$em = $this->getDoctrine()->getEntityManager();
// Set your group id as the desired criterion
$criteria = array('GroupId' => $group->getId);
// Get all users that match the criterion
$users = $em->getRepository("YourBundle:User")->findBy($criteria);
// Check whether the returned array is empty
if(count($users) != 0){
// Do your exception handling
}else {
// Do regular operations, like deleting the group
}
答案 2 :(得分:0)
如果要在删除组时删除组内的所有用户,可以告诉doctrine级联删除。因此,元数据文件的oneToMany部分(比如groups.orm.yml)看起来像
oneToMany:
users:
targetEntity: Users
mappedBy: user
cascade: [remove]