Голанг Горм: Можно ли удалить запись через отношение many2many?

У меня есть структура many2many, похожая на пример GORM:

// User has and belongs to many languages, use `user_languages` as join table
type User struct {
    gorm.Model
    Languages         []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
    Name string
}

db.Model(&user).Related(&languages)

Допустим, я создаю пользователя, и у него есть два связанных языка.

Я беру запись пользователя из базы данных и удаляю один язык из массива языков пользователя. Затем я сохраняю пользователя, задав для gorm: save_associations значение true.

Я ожидал, что GORM удалит запись, связывающую пользователя с этим языком (в таблице ассоциаций, которой управляет GORM). Однако он не удален. Ожидается ли это?

Можно ли удалить многие записи ассоциации, удалив язык из списка языков в записи пользователя, а затем сохранив пользователя? Если нет, то как это сделать в ГОРМ?

Обновить

Я нашел решение этого вопроса, но не уверен, что это лучший способ. Я сохраняю текущие языки, очищаю все ассоциации, затем добавляю языки, затем сохраняю.

languages := user.Languages
DB.Model(&user).Association("Languages").Clear()
user.Languages = languages

person Matthew S    schedule 08.07.2016    source источник


Ответы (3)


У меня была такая же проблема, если вы хотите просто удалить одну из ассоциаций, это сработало для меня

    c.DB.Model(&user).Association("Roles").Delete(&role)
person Alex    schedule 12.07.2016
comment
Спасибо, Алекс. Я видел этот подход в модульных тестах gorm. Но это не удовлетворяло моим требованиям. Мне нужно отправить обратно измененного пользователя, содержащего обновленный список языков, из внешнего интерфейса. Я не знаю конкретных языков, которые нужно удалить. - person Matthew S; 12.07.2016
comment
Я использую этот c.DB.Model (& user) .Association (Roles) .Delete (user.Roles), в котором user.Roles представляет собой массив ролей и удаляет все ассоциации между ролью и пользователем. - person Alex; 12.07.2016

Кроме того, вы можете сделать это с помощью «заменить»

DB.Model(&user).Association("Languages").Replace(user.Languages)
person user3389    schedule 15.09.2017

Я нашел решение этого вопроса, но не уверен, что это лучший способ. Я сохраняю текущие языки, очищаю все ассоциации, затем добавляю языки, затем сохраняю.

languages := user.Languages 
DB.Model(&user).Association("Languages").Clear()
user.Languages = languages
person Matthew S    schedule 08.07.2016
comment
Значит, вы должны взаимодействовать со всеми текущими ассоциациями? Представьте, что вы работаете не над небольшим проектом, а над одним из 10 тысяч записей ... - person Jimbo; 25.07.2019
comment
вам нужен метод замены, упомянутый в ответе @ user3389. - person Vaibhav Mishra; 28.06.2021