Golang Gorm の 1 対多の加算

1 対多の加算には 2 つのケースがあります。

  • 1つはユーザーを追加すると同時に記事を作成することです
  • 2 つ目は、既存のユーザーに関連付けられた記事を作成することです

ユーザー追加時に記事を作成する


package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// User 用户表 一个用户拥有多篇文章
type User struct {
	ID       int64
	Name     string    `gorm:"size:6"`
	Articles []Article //用户拥有的文章列表 has many
}

type Article struct {
	ID     int64  `gorm:"size:4"`
	Title  string `gorm:"size:16"`
	UserID int64  //属于  belongs to
    User   User   //属于  belongs to
}

func (*User) TableName() string {
	return "user"
}

func (*Article) TableName() string {
	return "article"
}

func main() {
	dsn := "root:7PXjAkY!&nlR@tcp(192.168.11.128:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.Debug().AutoMigrate(&User{}, &Article{})

	var u User
	a1 := Article{
		Title: "redis",
	}

	u = User{
		Name: "yanzi",
		Articles: []Article{
			{
				Title: "golang",
			},
			{
				Title: "k8s",
			},
			a1,
		},
	}

	db.Debug().Create(&u)
}


[8.981ms] [rows:3] INSERT INTO `article` (`title`,`user_id`) VALUES ('golang',2),('k8s',2),('redis',2) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user
_id`)
[14.812ms] [rows:1] INSERT INTO `user` (`name`) VALUES ('yanzi')

既存のユーザーに関連付けられた記事を作成する


最後の方法は、既存のユーザーを関連付けるです。

	var articles []Article
	articles = []Article{
		{
			Title:  "cherry",
			UserID: 2,
		},
		{
			Title:  "marry",
			UserID: 2,
		},
	}

	db.Debug().Create(&articles)

[11.754ms] [rows:2] INSERT INTO `article` (`title`,`user_id`) VALUES ('cherry',2),('marry',2)

ユーザー記事の作成と関連付け


	db.Debug().Create(&Article{
		Title: "c",
		User: User{
			Name: "yanzi",
		},
	})
	var u User
	db.Debug().Take(&u, 2)
	db.Create(&Article{
		Title: "php",
		User:  u,
	})

 

  • Model はマッピング関係を宣言するオブジェクト タイプであり、このオブジェクト タイプを通じてテーブル名とフィールドが検索されます。
  •  関連付けは、1 対多のフィールドを関連付けることです   
  • find は 1 対多の関係を検索することです。 append は 1 対多の関係を更新または追加することです

 関連は文字列であるフィールドに関連付けられます。次の find と append は、特定の構造体ポインター変数です。

db.Model(&user).Association("CreditCard").Find(&user.CreditCard) 

db.Debug().Model(&u).Association("Articles").Append(&a)

外部キーの追加 既存の記事は既存のユーザーに関連付けられます


	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 7)

	u.Articles = []Article{a}
	db.Debug().Save(&u)

[1.300ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1

[1.629ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 7 LIMIT 1

[2.901ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[6.363ms] [rows:0] UPDATE `user` SET `name`='test' WHERE `id` = 3

[0.557ms] [rows:0] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('marry',3,7) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

[3.713ms] [rows:0] INSERT INTO `user` (`name`,`id`) VALUES ('test',3) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`)


mysql> select * from user;
+----+-------+
| id | name  |
+----+-------+
|  1 | lucas |
|  2 | yanzi |
|  3 | test  |
+----+-------+
mysql> select * from article;
+----+--------+---------+
| id | title  | user_id |
+----+--------+---------+
|  1 | golang |       1 |
|  2 | k8s    |       1 |
|  3 | golang |       2 |
|  4 | k8s    |       2 |
|  5 | redis  |       2 |
|  6 | cherry |       2 |
|  7 | marry  |       3 |
+----+--------+---------+

	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 6)

	db.Debug().Model(&u).Association("Articles").Append(&a)

[2.196ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('cherry',3,6) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

Model はマッピング関係を宣言するオブジェクト タイプであり、このオブジェクト タイプを通じてテーブル名とフィールドが検索されます。

	var u User
	db.Debug().Take(&u, 3)

	var a Article
	db.Debug().Take(&a, 5)

	db.Debug().Model(&u).Association("Articles").Append(&a)

[1.409ms] [rows:1] SELECT * FROM `user` WHERE `user`.`id` = 3 LIMIT 1
[1.254ms] [rows:1] SELECT * FROM `article` WHERE `article`.`id` = 5 LIMIT 1
[2.285ms] [rows:2] INSERT INTO `article` (`title`,`user_id`,`id`) VALUES ('redis',3,5) ON DUPLICATE KEY UPDATE `user_id`=VALUES(`user_id`)

外部キーの既存のユーザー関連記事の追加 


おすすめ

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