@Entity('ROLE')
class Role {
@Column('number', { primary: true, name: 'ID', precision: 20, scale: 0 })
@AutoMap()
id: number;
@Column('varchar2', { name: 'name', nullable: true, length: 50 })
@AutoMap()
description: string | null;
}
@Entity('USER')
class User {
@Column('number', { primary: true, name: 'ID', precision: 20, scale: 0 })
@AutoMap()
id: number;
@Column('varchar2', { name: 'PASSWORD', nullable: true, length: 50 })
@AutoMap()
password: string | null;
@Column('nvarchar2', { name: 'USER_NAME', nullable: true, length: 100 })
@AutoMap()
email: string | null;
@Column('nvarchar2', { name: 'USER_NAME', nullable: true, length: 100 })
@AutoMap()
firstName: string | null;
@Column('nvarchar2', { name: 'USER_NAME', nullable: true, length: 100 })
@AutoMap()
lastName: string | null;
@Column('number', { primary: true, name: 'ROLE_ID', precision: 20, scale: 0 })
@AutoMap()
roleId: number;
@OneToOne(type => Role)
@JoinColumn({name: 'ID', referencedColumnName: 'roleId'})
@AutoMap(() => Role)
role: Role;
}
let userInfo = userRepo.findOne(id, {relations: ['role']});
. Khi này kết quả nhận được trông sẽ như sau:{
id: 1,
password: '123456',
email: '[email protected]',
firstName: 'Cesc',
lastName: 'Nguyễn',
roleId: 1,
role: {
id: 1,
description: 'staff'
}
}
class UserVm {
@AutoMap()
id: number;
@AutoMap()
email: string;
@AutoMap()
fullName: string;
@AutoMap()
roleName: string;
}
Đừng quên Mapper.createMap(User, UserVm);
ở bài trước nhé. Bài này chúng ta chỉ cần thêm 1 tẹo nữa thôi là code chạy ngon lành à
Mapper.createMap(User, UserVm)
.forMember(d => d.roleName, mapFrom(s => s.role.description))
.forMember(d => d.fullName, mapFrom(s => `${s.firstName} ${s.lastName}`));
Việc còn lại cũng chẳng còn gì. Anh em backend chỉ việc vểnh râu lên nhận kết quả thôi let userInfo = Mapper.map(userRepo.findOne(id, { relations: ['role'] } ), UserVm);
. Lúc này kết quả trông sẽ như sau nhé:
{
id: 1,
email: '[email protected]',
fullName: 'Cesc Nguyễn',
roleName: 'staff'
}
Giải thích qua một chút cho các bạn hiểu tại sao khi createMap
mình lại thêm 1 đoạn code kia nhé. Đầu tiên, forMember nhận vào 2 tham số, tham số thứ nhất là member trong destination class (class UserVm
), tham số thứ 2 là 1 member từ source class (class User
). Các bạn có thể hiểu nôm na là cái gì cần được map và thiết lập map như thế nào
Nhìn có vẻ ngon ăn phết rồi nhỉ. Tuy nhiên, sẽ có một vấn đề khi role
trong class User
mà có giá trị undefined thì sao (team Frontend nó lại được dịp xỉ vả chứ sao nữa :3). Tuy nhiên các bạn đừng lo, AutoMapper sẽ giúp bạn xử lý trường hơp này. Mình sẽ chia sẻ ở bài viết sau nhé. Cảm ơn các bạn đã đọc hết bài của mình, nếu thấy hay và hữu ích hay chia sẻ và star cho thư viện này trên github nhé các bạn :D