軟刪除
如果您的模型包含了一個 gorm.deletedat
字段(gorm.Model
已經包含了該字段),它將自動獲得軟刪除的能力!
擁有軟刪除能力的模型調用 Delete
時,記錄不會從數據庫中被真正刪除。但 GORM 會將 DeletedAt
置爲當前時間, 並且你不能再通過普通的查詢方法找到該記錄。
// user 的 ID 是 `111`
db.Delete(&user)
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;
// 批量刪除
db.Where("age = ?", 20).Delete(&User{})
// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;
// 在查詢時會忽略被軟刪除的記錄
db.Where("age = 20").Find(&user)
// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;
如果您不想引入 gorm.Model
,您也可以這樣啓用軟刪除特性:
type User struct {
ID int
Deleted gorm.DeletedAt
Name string
}
查找被軟刪除的記錄
您可以使用 Unscoped
找到被軟刪除的記錄
db.Unscoped().Where("age = 20").Find(&users)
// SELECT * FROM users WHERE age = 20;
但是scan是可以查詢該記錄的
scan無視DeletedAt
db.Where("age = 20").Scan(&users)
// SELECT * FROM users WHERE age = 20;
永久刪除
您也可以使用 Unscoped
永久刪除匹配的記錄
db.Unscoped().Delete(&order)
// DELETE FROM orders WHERE id=10;