mirror of
https://github.com/typeorm/typeorm.git
synced 2025-12-08 21:26:23 +00:00
docs: update zh_CN link path (#6652)
* update zh_CN link path * Update README-zh_CN.md
This commit is contained in:
parent
10b05a9210
commit
85c07fda2f
@ -22,13 +22,13 @@
|
||||
|
||||
TypeORM 是一个 [ORM](https://en.wikipedia.org/wiki/Object-relational_mapping) 框架,它可以运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React Native、Expo 和 Electron 平台上,可以与 TypeScript 和 JavaScript (ES5,ES6,ES7,ES8)一起使用。 它的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的小型应用还是拥有多数据库的大型企业应用)应用程序。
|
||||
|
||||
不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 [Active Record](./docs/active-record-data-mapper.md#what-is-the-active-record-pattern) 和 [Data Mapper](./docs/active-record-data-mapper.md#what-is-the-data-mapper-pattern) 模式,这意味着你可以以最高效的方式编写高质量的、松耦合的、可扩展的、可维护的应用程序。
|
||||
不同于现有的所有其他 JavaScript ORM 框架,TypeORM 支持 [Data Mapper](./docs/zh_CN/active-record-data-mapper.md#什么是data-mapper模式) 和 [Active Record](./docs/zh_CN/active-record-data-mapper.md#什么是active-record模式) 模式,这意味着你可以以最高效的方式编写高质量的、松耦合的、可扩展的、可维护的应用程序。
|
||||
|
||||
TypeORM 参考了很多其他优秀 ORM 的实现, 比如 [Hibernate](http://hibernate.org/orm/), [Doctrine](http://www.doctrine-project.org/) 和 [Entity Framework](https://www.asp.net/entity-framework)。
|
||||
|
||||
TypeORM 的一些特性:
|
||||
|
||||
- 同时支持 [DataMapper](./docs/active-record-data-mapper.md#what-is-the-data-mapper-pattern) 和 [ActiveRecord](./docs/active-record-data-mapper.md#what-is-the-active-record-pattern) (随你选择)
|
||||
- 同时支持 [DataMapper](./docs/zh_CN/active-record-data-mapper.md#什么是data-mapper模式) 和 [ActiveRecord](./docs/zh_CN/active-record-data-mapper.md#什么是active-record模式) (随你选择)
|
||||
- 实体和列
|
||||
- 数据库特性列类型
|
||||
- 实体管理
|
||||
@ -69,7 +69,7 @@ TypeORM 的一些特性:
|
||||
|
||||
通过使用 `TypeORM` 你的 `models` 看起来如下:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -90,7 +90,7 @@ export class User {
|
||||
|
||||
逻辑操作如下:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
const user = new User();
|
||||
user.firstName = "Timber";
|
||||
user.lastName = "Saw";
|
||||
@ -106,7 +106,7 @@ await repository.remove(timber);
|
||||
|
||||
或者,如果你更喜欢使用 `ActiveRecord` 模式,也可以这样用:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -127,7 +127,7 @@ export class User extends BaseEntity {
|
||||
|
||||
逻辑操作如下所示:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
const user = new User();
|
||||
user.firstName = "Timber";
|
||||
user.lastName = "Saw";
|
||||
@ -241,7 +241,7 @@ typeorm init --name MyProject --database mysql
|
||||
|
||||
此命令将在 `MyProject` 目录中生成一个包含以下文件的新项目:
|
||||
|
||||
```
|
||||
```sh
|
||||
MyProject
|
||||
├── src // TypeScript 代码
|
||||
│ ├── entity // 存储实体(数据库模型)的位置
|
||||
@ -259,9 +259,9 @@ MyProject
|
||||
|
||||
接下来安装项目依赖项:
|
||||
|
||||
```
|
||||
cd MyProject
|
||||
npm install
|
||||
```sh
|
||||
$ cd MyProject
|
||||
$ npm install
|
||||
```
|
||||
|
||||
在安装过程中,编辑 `ormconfig.json` 文件并在其中编辑自己的数据库连接配置选项:
|
||||
@ -286,8 +286,8 @@ npm install
|
||||
|
||||
完成配置并安装所有 node modules 后,即可运行应用程序:
|
||||
|
||||
```
|
||||
npm start
|
||||
```sh
|
||||
$ npm start
|
||||
```
|
||||
|
||||
至此你的应用程序应该成功运行并将新用户插入数据库。你可以继续使用此项目并集成所需的其他模块并创建更多实体。
|
||||
@ -305,7 +305,7 @@ npm start
|
||||
|
||||
举个例子, 你有一个 `Photo` 模型:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
export class Photo {
|
||||
id: number;
|
||||
name: string;
|
||||
@ -323,7 +323,7 @@ export class Photo {
|
||||
|
||||
让我们将 `Photo` 模型作为一个实体
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -344,7 +344,7 @@ export class Photo {
|
||||
|
||||
要添加数据库列,你只需要将要生成的实体属性加上 `@Column` 装饰器。
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -378,7 +378,7 @@ export class Photo {
|
||||
|
||||
每个**必须**至少有一个主键列。这是必须的,你无法避免。要使列成为主键,你需要使用 `@PrimaryColumn` 装饰器。
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryColumn } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -407,7 +407,7 @@ export class Photo {
|
||||
|
||||
假设你希望 id 列自动生成(这称为 auto-increment/sequence/serial/generated identity column)。为此你需要将`@PrimaryColumn` 装饰器更改为 `@PrimaryGeneratedColumn` 装饰器:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -437,7 +437,7 @@ export class Photo {
|
||||
接下来,让我们修改数据类型。默认情况下,字符串被映射到一个 varchar(255) 类型(取决于数据库类型)。
|
||||
数字被映射到一个类似 integer 类型(取决于数据库类型)。但是我们不希望所有的列都是有限的 varchars 或 integer,让我们修改下代码以设置想要的数据类型:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -464,13 +464,13 @@ export class Photo {
|
||||
}
|
||||
```
|
||||
|
||||
列类型是特定于数据库的。你可以设置数据库支持的任何列类型。有关支持的列类型的更多信息,请参见[此处](./docs/entities.md#column-types)。
|
||||
列类型是特定于数据库的。你可以设置数据库支持的任何列类型。有关支持的列类型的更多信息,请参见[此处](./docs/zh_CN/entities.md#列类型)。
|
||||
|
||||
### 创建数据库的连接
|
||||
|
||||
当实体被创建后,让我们创建一个`index.ts`(或`app.ts`,无论你怎么命名)文件,并配置数据库连接::
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import "reflect-metadata";
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
@ -502,7 +502,7 @@ createConnection({
|
||||
|
||||
之后当我们创建更多实体时,都需要一一将它们添加到配置中的实体中,但是这不是很方便,所以我们可以设置加载整个目录,从中连接所有实体并使用:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
|
||||
createConnection({
|
||||
@ -547,7 +547,7 @@ createConnection({
|
||||
|
||||
现在创建一个新的 photo 存到数据库:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -573,7 +573,7 @@ createConnection(/*...*/)
|
||||
|
||||
我们可以使用ES8(ES2017)的新特性,并使用 async/await 语法代替:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -598,7 +598,7 @@ createConnection(/*...*/)
|
||||
|
||||
例如,加载已经保存的实体:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -613,13 +613,13 @@ createConnection(/*...*/)
|
||||
|
||||
`savedPhotos` 是一个 Photo 对象数组,其中包含从数据库加载的数据。
|
||||
|
||||
了解更多有关 [EntityManager](./docs/working-with-entity-manager.md) 的信息。
|
||||
了解更多有关 [EntityManager](./docs/zh_CN/working-with-entity-manager.md) 的信息。
|
||||
|
||||
### 使用 Repositories
|
||||
|
||||
现在让我们重构之前的代码,并使用 `Repository` 替代 `EntityManager`。每个实体都有自己的repository,可以处理其实体的所有操作。当你经常处理实体时,Repositories 比 EntityManagers 更方便使用:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -643,13 +643,13 @@ createConnection(/*...*/)
|
||||
.catch(error => console.log(error));
|
||||
```
|
||||
|
||||
了解更多有关 [Repository](./docs/working-with-repository.md) 的信息。
|
||||
了解更多有关 [Repository](./docs/zh_CN/working-with-repository.md) 的信息。
|
||||
|
||||
### 从数据库加载
|
||||
|
||||
让我们使用 Repository 尝试更多的加载操作:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -682,7 +682,7 @@ createConnection(/*...*/)
|
||||
|
||||
让我们从数据库加载出 photo,更新并保存到数据库:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -702,7 +702,7 @@ createConnection(/*...*/)
|
||||
|
||||
让我们从数据库中删除 Photo:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
|
||||
@ -721,7 +721,7 @@ createConnection(/*...*/)
|
||||
|
||||
要与另一个类创建一对一的关系。先在 `PhotoMetadata.ts` 中创建一个新类。此 PhotoMetadata 类应包含 photo 的其他元信息:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn } from "typeorm";
|
||||
import { Photo } from "./Photo";
|
||||
|
||||
@ -777,7 +777,7 @@ export class PhotoMetadata {
|
||||
|
||||
现在让我们来创建一个 photo,它的元信息将它们互相连接起来。
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
import { PhotoMetadata } from "./entity/PhotoMetadata";
|
||||
@ -820,7 +820,7 @@ createConnection(/*...*/)
|
||||
|
||||
关系可以是单向的或双向的。目前 PhotoMetadata 和 Photo 之间的关系是单向的。关系的所有者是 PhotoMetadata,而 Photo 对 PhotoMetadata 一无所知。这使得从 Photo 中访问 PhotoMetadata 变得很复杂。要解决这个问题,我们应该在 PhotoMetadata 和 Photo 之间建立双向关系。让我们来修改一下实体:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn } from "typeorm";
|
||||
import { Photo } from "./Photo";
|
||||
|
||||
@ -855,7 +855,7 @@ export class Photo {
|
||||
|
||||
在一个查询中加载 photo 及 photo metadata 有两种方法。使用 `find *` 或使用 `QueryBuilder`。我们先使用 `find *` 方法。 `find *` 方法允许你使用 `FindOneOptions` / `FindManyOptions` 接口指定对象。
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
import { PhotoMetadata } from "./entity/PhotoMetadata";
|
||||
@ -869,11 +869,11 @@ createConnection(/*...*/)
|
||||
.catch(error => console.log(error));
|
||||
```
|
||||
|
||||
photos 包含来自数据库的 photos 数组,每个 photo 包含其 photo metadata。详细了解本文档中的[Find 选项](./docs/find-options.md)。
|
||||
photos 包含来自数据库的 photos 数组,每个 photo 包含其 photo metadata。详细了解本文档中的[Find 选项](./docs/zh_CN/find-options.md)。
|
||||
|
||||
使用find选项很简单,但是如果你需要更复杂的查询,则应该使用 `QueryBuilder`。 `QueryBuilder` 使用更优雅的方式执行更复杂的查询:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { createConnection } from "typeorm";
|
||||
import { Photo } from "./entity/Photo";
|
||||
import { PhotoMetadata } from "./entity/PhotoMetadata";
|
||||
@ -896,7 +896,7 @@ createConnection(/*...*/)
|
||||
|
||||
我们可以在关系中设置 `cascade` 选项,这时就可以在保存其他对象的同时保存相关对象。让我们更改一下的 photo 的 `@OneToOne` 装饰器:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
export class Photo {
|
||||
/// ... 其他列
|
||||
|
||||
@ -909,7 +909,7 @@ export class Photo {
|
||||
|
||||
使用 `cascade` 允许就不需要边存 photo 边存元数据对象。我们可以简单地保存一个 photo 对象,由于使用了 cascade,metadata 也将自动保存。
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
createConnection(options)
|
||||
.then(async connection => {
|
||||
// 创建 photo 对象
|
||||
@ -966,7 +966,7 @@ export class Author {
|
||||
|
||||
现在让我们将关系的所有者方添加到 Photo 实体中:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from "typeorm";
|
||||
import { PhotoMetadata } from "./PhotoMetadata";
|
||||
import { Author } from "./Author";
|
||||
@ -1011,7 +1011,7 @@ export class Photo {
|
||||
|
||||
假设一个 photo 可以放在多个 albums 中,每个 albums 可以包含多个 photo。让我们创建一个`Album`类:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
@ -1032,7 +1032,7 @@ export class Album {
|
||||
|
||||
现在添加反向关系到`Photo`类:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
export class Photo {
|
||||
/// ... 其他列
|
||||
|
||||
@ -1054,7 +1054,7 @@ export class Photo {
|
||||
|
||||
记得在 ORM 中使用 ConnectionOptions 注册`Album`类:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
const options: ConnectionOptions = {
|
||||
// ... 其他选项
|
||||
entities: [Photo, PhotoMetadata, Author, Album]
|
||||
@ -1063,7 +1063,7 @@ const options: ConnectionOptions = {
|
||||
|
||||
现在让我们将 albums 和 photos 插入我们的数据库:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
let connection = await createConnection(options);
|
||||
|
||||
// 创建一些 albums
|
||||
@ -1090,7 +1090,7 @@ const loadedPhoto = await connection.getRepository(Photo).findOne(1, { relations
|
||||
|
||||
`loadedPhoto` 如下所示:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
{
|
||||
id: 1,
|
||||
name: "Me and Bears",
|
||||
@ -1110,7 +1110,7 @@ const loadedPhoto = await connection.getRepository(Photo).findOne(1, { relations
|
||||
|
||||
你可以使用 QueryBuilder 构建几乎任何复杂性的 SQL 查询。例如,可以这样做:
|
||||
|
||||
```typescript
|
||||
```ts
|
||||
let photos = await connection
|
||||
.getRepository(Photo)
|
||||
.createQueryBuilder("photo") // 第一个参数是别名。即photos。 该参数必须指定。
|
||||
@ -1128,7 +1128,7 @@ let photos = await connection
|
||||
此查询选择所有 published 的 name 等于"My"或"Mishka"的 photos。它将从结果中的第 5 个(分页偏移)开始,并且仅选择 10 个结果(分页限制)。得到的结果将按 ID 降序排序。photo 的 albums 将被 left-joined,其元数据将被 inner joined。
|
||||
|
||||
由于 QueryBuilder 的自由度更高,因此在项目中可能会大量的使用它。
|
||||
更多关于 QueryBuilder 的信息,[可查看](./docs/select-query-builder.md)。
|
||||
更多关于 QueryBuilder 的信息,[可查看](./docs/zh_CN/select-query-builder.md)。
|
||||
|
||||
## 示例
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user