削除では、中間テーブル内のデータのみが削除され、元のテーブルは削除されます。
var a Article1
db.Preload("Tag1s").Take(&a, 1)
fmt.Printf("%v", a)
{1 k8s [{1 cloud []} {2 linux []}]}
mysql> select * from article1;
+----+--------+
| id | title |
+----+--------+
| 1 | k8s |
| 2 | golang |
+----+--------+
mysql> select * from tag1;
+----+-------+
| id | name |
+----+-------+
| 1 | cloud |
| 2 | linux |
+----+-------+
mysql> select * from article_tags;
+-------------+---------+
| article1_id | tag1_id |
+-------------+---------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
+-------------+---------+
(1) モデルは最初にこのテーブルを取得します。
(2) 次に、関連付けによって 3 番目のタグのテーブルが接続されます。
(3) その後、どのような操作を行うかが最も重要ですが、ここでは削除です。誰を削除する必要がありますか? 削除されるのは、記事に関連付けられているタグです。
var a Article1
db.Preload("Tag1s").Take(&a, 1)
db.Model(&a).Association("Tag1s").Delete(a.Tag1s)
fmt.Printf("%v", a)
{1 k8s []}
mysql> select * from tag1;
+----+-------+
| id | name |
+----+-------+
| 1 | cloud |
| 2 | linux |
+----+-------+
mysql> select * from article1;
+----+--------+
| id | title |
+----+--------+
| 1 | k8s |
| 2 | golang |
+----+--------+
mysql> select * from article_tags;
+-------------+---------+
| article1_id | tag1_id |
+-------------+---------+
| 2 | 2 |
+-------------+---------+
上記と同様に「Append」を使用して追加します
var t []Tag1
db.Find(&t)
var a Article1
db.Preload("Tag1s").Take(&a, 1)
db.Model(&a).Association("Tag1s").Append(&t)
fmt.Printf("%v", a)
{1 k8s [{1 cloud []} {2 linux []}]}
mysql> select * from article1;
+----+--------+
| id | title |
+----+--------+
| 1 | k8s |
| 2 | golang |
+----+--------+
mysql> select * from tag1;
+----+-------+
| id | name |
+----+-------+
| 1 | cloud |
| 2 | linux |
+----+-------+
mysql> select * from article_tags;
+-------------+---------+
| article1_id | tag1_id |
+-------------+---------+
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
+-------------+---------+
交換する
var t Tag1
db.Take(&t, 1)
var a Article1
db.Preload("Tag1s").Take(&a, 2)
db.Model(&a).Association("Tag1s").Replace(&t)
fmt.Printf("%v", a)
{2 golang [{1 cloud []}]}