gorm之Many To Many(多对多)

6,476 阅读1分钟

我们在开发过程中经常面对多对多的情况,那么我们应该怎么做呢?在实际工作中,权限和角色符合一对多的情况,下面我就一简单的RBAC做个简单示例。 权限表

  1. 一个权限对应多个角色
  2. 一个角色拥有多个权限
  3. 通过一个中间表进行关联
package models

type Permission struct {
	Model
	Path     string `json:"path"`
	Title    string `json:"title"`
	ApiPath  string `json:"apiPath"`
	ParentId uint   `json:"parentId" gorm:"default:0"`
	Icon     string `json:"icon"`
}

角色表

package models

type Role struct {
	Model
	RoleName    string `json:"roleName"`
	Description string `json:"description"`
	//不同步更新permission表
	//Permission  []Permission `json:"permission" gorm:"many2many:role_permissions;association_autoupdate:false;association_autocreate:false"`
	//同步更新permission表
	Permission []Permission `json:"permission" gorm:"many2many:role_permissions"`
}


权限角色关联表

package models

type RolePermission struct {
	Model
	RoleId       uint `json:"roleId"`
	PermissionId uint `json:"permissionId"`
}

示例

package main

import (
	"ginLearn.com/models"
)

func main() {
	db := models.DB()
	role := models.Role{}
	role.ID = 8
	var permissionSlice []models.Permission
	//根据角色查询所有权限
	//SELECT `permissions`.* FROM `permissions` INNER JOIN `role_permissions`
	//ON `role_permissions`.`permission_id` = `permissions`.`id`
	//WHERE `permissions`.`deleted_at` IS NULL AND ((`role_permissions`.`role_id` IN (8)))
	db.Model(&role).Related(&permissionSlice, "permission")

	//我们更新角色的所有权限该怎么做呢?
	//1、删除角色的所有的权限
	db.Where("role_id=?", role.ID).Unscoped().Delete(&models.RolePermission{})
	//2、给角色赋予权限
	role.Permission = []models.Permission{permissionSlice[0]}
	//更新角色的权限
	//UPDATE `roles` SET `updated_at` = '2020-03-24 01:14:17', `deleted_at` = NULL, `role_name` = '', `description` = ''  WHERE `roles`.`deleted_at` IS NULL AND `roles`.`id` = 8
	//UPDATE `permissions` SET `updated_at` = '2020-03-24 01:14:17', `deleted_at` = NULL, `path` = '', `title` = '仪表盘', `api_path` = '', `parent_id` = 0, `icon` = 'el-icon-monitor
	//'  WHERE `permissions`.`deleted_at` IS NULL AND `permissions`.`id` = 1
	//INSERT INTO `role_permissions` (`role_id`,`permission_id`) SELECT 8,1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM `role_permissions` WHERE `role_id` = 8 AND `permission_id` = 1)
	db.Save(&role)
}

在这里,我们演示了多对多关系下的查询和修改,通过角色找到权限;更新角色权限。例外附上了测试的SQL和数据库。需要的小伙伴自行下载。

链接:pan.baidu.com/s/1OE-6jhPj… 提取码:xxq0 复制这段内容后打开百度网盘手机App,操作更方便哦