symfony2中的许多学说

时间:2012-11-21 18:32:44

标签: exception symfony doctrine

我有多个用户和组关联,然后删除我正在使用的用户中使用的组:

  

DBALException:执行'DELETE FROM时发生异常   群组WHERE id =?'与params ...完整性约束违规:   1451无法删除或更新父行:外键约束   失败...

     

DBALException:执行'DELETE FROM时发生异常   群组WHERE id =?'与params ...完整性约束违规:   1451无法删除或更新父行:外键约束   失败

... 这是正常的,我怎么能捕捉异常,或检查它是否以某种方式使用?

3 个答案:

答案 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]

此处有更多信息http://docs.doctrine-project.org/en/2.0.x/reference/working-with-associations.html#transitive-persistence-cascade-operations