我這是在用戶我真的開始習慣的用戶和組相關多對一,然後刪除組:多對一主義
DBALException:執行「DELETE FROM 組發生異常WHERE ID = ?使用參數...完整性約束違規: 1451不能刪除或更新父行,外鍵約束 失敗...
DBALException:在執行時發生異常「DELETE FROM 組,其中的id =?」使用參數...完整性約束違規: 1451不能刪除或更新父行,外鍵約束 失敗
... ,這是正常的,我怎麼能抓住異常,或者檢查是否以某種方式使用?
我這是在用戶我真的開始習慣的用戶和組相關多對一,然後刪除組:多對一主義
DBALException:執行「DELETE FROM 組發生異常WHERE ID = ?使用參數...完整性約束違規: 1451不能刪除或更新父行,外鍵約束 失敗...
DBALException:在執行時發生異常「DELETE FROM 組,其中的id =?」使用參數...完整性約束違規: 1451不能刪除或更新父行,外鍵約束 失敗
... ,這是正常的,我怎麼能抓住異常,或者檢查是否以某種方式使用?
這意味着,你可能有你的數據庫設置了外鍵,這樣的:
|---------|
| User |
|---------|
| id |
| groupId |
|---------|
|-------|
| Group |
|-------|
| id |
|-------|
凡User.groupId
指Group.id
。這意味着當您刪除一個組時,您需要定義數據庫應該對該組中的用戶做些什麼。
根據你的意圖,可以改變你的外鍵約束來處理這種情況。你沒有提到你使用的數據庫類型,但我知道在MySQL中你可以有一個CONSTRAINT
和ON DELETE
子句,並給它RESTRICT
(默認,你現在看到的),CASCADE
(刪除所有與該組關聯的用戶)以及(爲其組已刪除的用戶設置groupId
至NULL
)。
除了在數據庫級使用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
}
如果您想在刪除組時刪除組內的所有用戶,可以告訴原則級聯刪除。所以,你的元數據文件的一對多部分(比如groups.orm.yml)看起來像
oneToMany:
users:
targetEntity: Users
mappedBy: user
cascade: [remove]