typeORM 多對多關係不同情況的處理

2022-05-02 18:39:08 字數 2708 閱讀 2212

本文以rbac許可權管理中的使用者和角色舉例,兩個實體存在多對多的關係,乙個使用者擁有多個角色,乙個角色屬於多個使用者。typeorm的中文文件沒有對自定義中間表的說明,發現英文有相關說明,但示例**貌似有問題。

一、中間表有自定義欄位的處理

在使用者user和role實體之外,新建乙個roleuse的實體(記錄使用者和角色的關聯關係),如此本來是多對多的關係,變成了user和role與roleuser二組一對多的關係,這樣雖然會多定義乙個實體,但好處是可以中間表可以擴充套件定義其它額外的資料

使用者實體 user.entity.ts

import  from 'typeorm';

import from '../../admin/role/role.entity';

import from '../../admin/role/roleuser.entity';

@entity()

export class user )

@index()

name: string;

@onetomany(type => userrole, userrole => userrole.user)

userroles: userrole;

}

角色實體role.entity.ts

import  from 'typeorm';

import from '../../../common/base/base.entity';

import from './roleuser.entity';

@entity('role')

export class role extends baseentity )

role_name: string;

@onetomany(type => userrole, userrole =>userrole.role)

userroles: userrole;

}

中間表實體 roleuser.entity.ts (主健)

import  from 'typeorm';

import from '../../../common/base/base.entity';

import from '../../web/user/user.entity';

import from './role.entity';

@entity()

export class userrole )

user: user;

@manytoone(type => role, role => role.userroles)

@joincolumn()

role: role;

}

中間表定義roleuser.entity.ts(復合主鍵)

import  from 'typeorm';

import from '../../../common/base/base.entity';

import from '../../web/user/user.entity';

import from './role.entity';

@entity()

export class userrole )

@joincolumn()

user: user;

@manytoone(type => role, role => role.userroles, )

@joincolumn()

role: role;

}

二、無中間表的多對多實體定義,又分為單向和雙向,單向是僅在一側與關係裝飾器的關係, 雙向是與關係兩側的裝飾者的關係。具體官網文件:此處主要講雙向

角色實體  

import  from 'typeorm';

import from '../../../common/base/base.entity';

import from '../../web/user/user.entity';

@entity('role')

export class role extends baseentity )

role_name: string;

@column()

remark: string;

// 無中間實體表的配置

@manytomany(type => user, user => user.roles, )

users: user;

}

使用者實體

import  from 'typeorm';

import from '../../admin/role/role.entity';

@entity()

export class user )

@index()

name: string;

// 無中間實體表的配置

@manytomany(type => role, role => role.users)

@jointable(

],inversejoincolumns: []})

// 下面的定義也能實現

// @jointable(,

// inversejoincolumn: ,

// })

roles: role;

}

多對多關係

實體模型中相關的模型之間為了方便查詢需要做到你中有我 我中有你 一對多表設計上是在多方應用少方的主鍵作為外來鍵約束 模型上需要在多方加入乙個少方模型物件的屬性,在少方加入乙個多方物件的列表 語法 少方物件 db.relationship 少方模型名 backref db.backref xxlist...

Flask sqlalchemy多對多關係

from flask import flask from flask sqlalchemy import sqlalchemy article tag db.table article tag db.column article id db.integer,db.foreignkey article...

多對多關係對映

需要用到 manytomany註解,然後在需要維護關係的一方,加上 jointable註解。必須指定乙個維護關係,否則會導致關係表id重複出現錯誤。jointable 有以下屬性,joincolumns 設定該實體類對映在關係表中的外來鍵列名和參照列,inversecolumns 設定和該實體類關聯...