Каскад мягкого удаления не работает - PullRequest
0 голосов
/ 29 августа 2018

Цель: если пользователь помечен как удаленный при мягком удалении, его календарь также должен быть помечен как удаленный.

: * Структуры 1004 *

type User struct {
    gorm.Model
    Username  string
    FirstName string
    LastName  string
    Calendar  Calendar
}

type Calendar struct {
    gorm.Model
    Name   string
    UserID uint
}

ограничение:

db.Model(&Calendar{}).AddForeignKey("user_id", "users(id)", "CASCADE","CASCADE")

Проблема:

Сложное удаление работает: и пользователь, и его календарь удалены (записи пропали)

db.Exec("Delete from users where id=3")

Мягкое удаление не работает как ожидание:

db.Where("id = ?", 3).Delete(&User{})

с мягким удалением,

  1. поле таблицы пользователя => Удалено_, датировано.
  2. календарная таблица =? Удалено_ пусто

Есть идеи?

1 Ответ

0 голосов
/ 30 августа 2018

Мягкое удаление означает, что gorm не удалит ваши данные. Он помечает только ненулевую отметку времени DeleteAt. Это не поддерживается базой данных напрямую. Таким образом, внешний ключ здесь не действует.

Это означает, что вам нужно самостоятельно реализовать каскадное удаление, например:

func DeleteUser(db *gorm.DB, id int) error {
  tx := db.Begin()
  if tx.Where("id = ?", id).Delete(&User{}); tx.Error != nil {
    tx.Rollback()
    return tx.Error
  }
  // Changed this line
  // if tx.Where("user_id = id", 3).Delete(&Calendar{}); tx.Error != nil {
     if tx.Where("user_id = ?", id).Delete(&Calendar{}); tx.Error != nil {
    tx.Rollback()
    return tx.Error
  }
  return tx.Commit().Error
}
...