Nest.js学习之路(23)-TypeORM(10) Embedded Entity及Entity Listener& Subscriber

这章内容参考TypeORM官网Embedded EntityEntity Listener/Subscriber

Embedded Entity

对于每个Entity都会用的栏位/属性,可以用partial entity的概念,把相关的属性独立出来一个class,增加code reuse。

例如,每个Entity都要建立时间跟上次更新时间

则可以新增EntityDate class如下

@Entity()
export class EntityDate {
    @Column({
        nullable: true,
    })
    LastUpdatedDate: Date;

    @Column({
        nullable: true,
    })
    createDate: Date;
}

在User、Role及Platform都加入下面这段

@Column(type => EntityDate) // 指定column为EntityDate Entity
entityDate: EntityDate; // 型别为EntityDate

在下面Listener& Subscriber部分测试

Entity Listener

简单来说就是Entity有读取、新增、修改、删除的动作之前或之后可以做一些事情

主要有以下

  • @AfterLoad()
    • 适用QueryBuilder及Repository find
  • @BeforeInsert()/@AfterInsert()
    • 仅适用Repository save方法
  • @BeforeUpdate()/@AfterUpdate()
    • 仅适用Repository save方法,update不行
  • @BeforeRemove()/@AfterRemove()
    • 仅适用Repository remove方法

大致来看,Listener用在用Repository操作比较多,无法QueryBuilder无法触发Entity Listener。

以Role Entity为例,假设新增或修改Role时,EntityDate属性要更新。

@Entity()
export class Role {
    ...

    @ManyToMany(type => User, user => user.roles)
    users: User[];

    @Column(type => EntityDate)
    entityDate: EntityDate ;

    @BeforeInsert()
    updateDatesWhenInsert(){
        // 新增entity前指定现在时间给下列属性
        this.entityDate.createDate = new Date(); 
        this.entityDate.LastUpdatedDate = new Date();
    }

    @BeforeUpdate()
    updateDateWhenUpdate(){
        // 更新entity前更新LastUpdatedDate
        this.entityDate.LastUpdatedDate = new Date();
    }
}

Event Subscriber

Event Listener没办法用在User Entity上,因为User Service已经用Query Builder改写。

如果希望User新增前填入目前时间,新增后加入user权限,根据typeorm官网,可以用Event Subscriber

新增UserSubscriber.ts,注意目录要放在typeormconfig指定的位置

 "migrations": [
       "src/shared/migration/**/*.ts"
    ],
    "subscribers": [
       "src/shared/subscriber/*.ts"
    ],

可以用typorm cli

typeorm subscriber:create -n UserSubscriber

import { EventSubscriber, EntitySubscriberInterface, InsertEvent } from 'typeorm';
import { User } from 'shared/entity/User';
import { Logger } from '@nestjs/common';
import { Role } from 'shared/entity/Role';

@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {

    listenTo(){
        return User;
    }

    async beforeInsert(event: InsertEvent<User>){
        Logger.log(`-----Before Insert------`);
                    Logger.log(event.entity); // 显示insert之前entity的信息
                    event.entity.entityDate = {
                    createDate: new Date(),
                    LastUpdatedDate: new Date(),
                };
    }

    async afterInsert(event: InsertEvent<User>){
        Logger.log(`-----After Insert------`);
        // 希望在insert user后自动加入user权限
        // 使用Subscriber的好处是可以从event取得entity manager物件
        // 进而可以使用querybuilder做任何SQL操作
        const role = await event.manager.createQueryBuilder(Role, 'r')
                   .where('r.roleName = :name', {name: 'user'})
                   .getOne();
        // 要加入user使用relationquerybuilder
        event.manager.createQueryBuilder(User, 'u')
                     .relation('roles')
                     .of(event.entity)
                     .add(role);
    }
}

不指定roleIds,把userService稍微改写以后用Postman测试


2018111601.png

推荐一下我的公众号: 【 geekjc 】,微信号: 【 c8706288 】一起学习交流编程知识,分享经验,各种有趣的事。

tuiguang.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容