Golang gorm manytomany 多対多の更新、削除、置換

 

 

 

削除では、中間テーブル内のデータのみが削除され、元のテーブルは削除されます。


	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 []}]}

 

おすすめ

転載: blog.csdn.net/qq_34556414/article/details/132863536