Каскад мягкого удаления не работает

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

структуры:

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. поле таблицы пользователей => deleted_at датировано.
  2. календарный стол =? deleted_at пуст

Любые идеи?


person aaa    schedule 29.08.2018    source источник


Ответы (1)


Мягкое удаление означает, что 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
}
person Koala Yeung    schedule 30.08.2018