Active Record ä¸ Data Mapper
ä»ä¹æ¯Active Record模å¼ï¼â
å¨ TypeORM ä¸ï¼ä½ å¯ä»¥ä½¿ç¨ Active Record å Data Mapper 模å¼ã
ä½¿ç¨ Active Record æ¹æ³ï¼ä½ å¯ä»¥å¨æ¨¡åæ¬èº«å å®ä¹æææ¥è¯¢æ¹æ³ï¼å¹¶ä½¿ç¨æ¨¡åæ¹æ³ä¿åãå é¤åå 载对象ã
ç®åæ¥è¯´ï¼Active Record æ¨¡å¼æ¯ä¸ç§å¨æ¨¡åä¸è®¿é®æ°æ®åºçæ¹æ³ã ä½ å¯ä»¥å¨Wikipedia䏿¥çæå ³ Active Record 模å¼çæ´å¤ä¿¡æ¯ã
ä¾å¦:
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
isActive: boolean;
}
ææ active-record å®ä½é½å¿
é¡»æ©å±BaseEntityç±»ï¼å®æä¾äºä¸å®ä½ä¸èµ·ä½¿ç¨çæ¹æ³ã
以ä¸ç¤ºä¾å±ç¤ºå¦ä½ä½¿ç¨æ¤ç±»å®ä½ï¼
// 示ä¾å¦ä½ä¿åARå®ä½
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await user.save();
// 示ä¾å¦ä½å é¤ARå®ä½
await user.remove();
// 示ä¾å¦ä½å è½½ARå®ä½
const users = await User.find({ skip: 2, take: 5 });
const newUsers = await User.find({ isActive: true });
const timber = await User.findOne({ firstName: "Timber", lastName: "Saw" });
BaseEntityå
·ææ åRepositoryç大é¨åæ¹æ³ã
大夿°æ
åµä¸ï¼ä½ ä¸éè¦å°RepositoryæEntityManagerä¸ active record å®ä½ä¸èµ·ä½¿ç¨ã
ç°å¨å设æä»¬è¦å建ä¸ä¸ªæ first name å last name è¿åç¨æ·ç彿°ã
æä»¬å¯ä»¥å¨Userç±»ä¸åå»ºéææ¹æ³ç彿°ï¼
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
isActive: boolean;
static findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany();
}
}
å¹¶å使ç¨å ¶ä»æ¹æ³ä¸æ ·ä½¿ç¨å®ï¼
const timber = await User.findByName("Timber", "Saw");
ä»ä¹æ¯Data Mapper模å¼ï¼â
å¨ TypeORM ä¸ï¼æ¨å¯ä»¥ä½¿ç¨ Active Record å Data Mapper 模å¼ã
ä½¿ç¨ Data Mapper æ¹æ³ï¼ä½ å¯ä»¥å¨å为"repositories"çåç¬ç±»ä¸å®ä¹æææ¥è¯¢æ¹æ³ï¼å¹¶ä½¿ç¨åå¨åºä¿åãå é¤åå 载对象ã 卿°æ®æ å°å¨ä¸ï¼ä½ çå®ä½é常笨ï¼å®ä»¬åªæ¯å®ä¹äºç¸åºç屿§ï¼å¹¶ä¸å¯è½æä¸äºå¾ç¬¨çæ¹æ³ã
ç®åæ¥è¯´ï¼æ°æ®æ å°å¨æ¯ä¸ç§å¨åå¨åºè䏿¯æ¨¡åä¸è®¿é®æ°æ®åºçæ¹æ³ã ä½ å¯ä»¥å¨Wikipedia䏿¥çæ´å¤å ³äº data mapper çä¿¡æ¯ã
ä¾å¦:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstName: string;
@Column()
lastName: string;
@Column()
isActive: boolean;
}
以ä¸ç¤ºä¾å±ç¤ºå¦ä½ä½¿ç¨æ¤ç±»å®ä½ï¼
const userRepository = connection.getRepository(User);
// 示ä¾å¦ä½ä¿åDMå®ä½
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await userRepository.save(user);
// 示ä¾å¦ä½å é¤DMå®ä½
await userRepository.remove(user);
// 示ä¾å¦ä½å è½½DMå®ä½
const users = await userRepository.find({ skip: 2, take: 5 });
const newUsers = await userRepository.find({ isActive: true });
const timber = await userRepository.findOne({ firstName: "Timber", lastName: "Saw" });
ç°å¨å设æä»¬è¦å建ä¸ä¸ªæ first name å last name è¿åç¨æ·ç彿°ã æä»¬å¯ä»¥å¨"custom repository"ä¸åå»ºè¿æ ·çåè½ã
import { EntityRepository, Repository } from "typeorm";
import { User } from "../entity/User";
@EntityRepository()
export class UserRepository extends Repository<User> {
findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany();
}
}
并以è¿ç§æ¹å¼ä½¿ç¨å®ï¼
const userRepository = connection.getCustomRepository(UserRepository);
const timber = await userRepository.findByName("Timber", "Saw");
äºè§£æå ³custom repositoriesçæ´å¤ä¿¡æ¯ã
æåºè¯¥éæ©åªä¸ä¸ªï¼â
å³å®åå³äºä½ ã è¿ä¸¤ç§çç¥é½æèªå·±ç缺ç¹åä¼ç¹ã
å¨è½¯ä»¶å¼å䏿们åºè¯¥å§ç»ç¢è®°çä¸ä»¶äºæ¯æä»¬å¦ä½ç»´æ¤å®ã
Data Mapperæ¹æ³å¯ä»¥å¸®å©ä½ ä¿æè½¯ä»¶çå¯ç»´æ¤æ§ï¼è¿å¨æ´å¤§çåºç¨ç¨åºä¸æ´ææã
Active recordæ¹æ³å¯ä»¥å¸®å©ä½ ä¿æç®åï¼è¿å¨å°ååºç¨ç¨åºä¸è¿è¡æ´å¥½ã
ç®åæ§å§ç»æ¯æé«å¯ç»´æ¤æ§çå
³é®ã