import { Bone, DataTypes: { SMALLINT } } from 'leoric';
class User extends Bone {
@Column({ primaryKey: true })
id: bigint;
@Column({ allowNull: false })
name: string;
@Column()
createdAt: Date;
@Column()
updatedAt: Date;
@Column({ type: SMALLINT })
age: number;
}
下面是 @Column() 支持的配置项列表:
| 配置项 | 功能描述 |
|---|---|
| primaryKey = false | 声明主键 |
| autoIncrement = false | 启用自增字段,字段类型必须是数值类型 |
| allowNull = true | 允许字段存储空值 NULL |
| type = typeof field | 自定义字段类型 |
| name = string | 原始字段名 |
如果省略 type 配置项,@Column() 会尝试按照如下映射关系推导当前字段类型:
| ts type | data type |
|---|---|
| number | INTEGER |
| string | STRING / VARCHAR(255) |
| Date | DATE |
| bigint | BIGINT |
| boolean | BOOLEAN / TINYINT(1) |
一个比较复杂的例子:
class User extends Bone {
@Column({ name: 'ssn', primaryKey: true, type: VARCHAR(16) })
ssn: string;
@Column({ name: 'gmt_create', allowNull: false })
createdAt: Date;
}
import User from './user';
class Post extends Bone {
@BelongsTo()
user: User;
}
const post = await Post.include('user').first;
assert.ok(post.user.id);
如果关联字段的命名不符合命名约定,需要按如下方式手动配置:
class Post extends Bone {
@BelongsTo({ foreignKey: 'authorId' })
user: User;
}
import Post from './post';
class User extends Bone {
@HasMany()
posts: Post[];
}
如果关联字段的命名不符合命名约定,需要按如下方式手动配置:
class User extends Bone {
@HasMany({ foreignKey: 'authorId' })
posts: Post[];
}
在一个 hasMany 关联关系中(也叫一对多关联),用来创建关联关系的字段应该在外表上面,在上述示例中,也就是需要 posts.user_id 或者 posts.author_id。推荐阅读《关联关系》文档了解更多使用细节。
import Profile from './profile';
class User extends Bone {
@HasOne()
profile: Profile;
}
如果关联字段的命名不符合命名约定,需要按如下方式手动配置:
import Profile from './profile';
class User extends Bone {
@HasOne({ foreignKey: 'ownerId' })
profile: Profile;
}
hasOne 的配置方式和 hasMany 几乎相同,同样需要在外表中添加关联字段。
虽然 hasOne 和 belongsTo 都可以被用来配置一对一关联,但两者之间有个比较大的差别在于关联字段所属的表。如果是 belongsTo,需要关联字段添加到主表中,如果是 hasOne,则需要放到外表。推荐阅读《关联关系》文档了解更多使用细节。