类型框架关系
TypeFramework Relationships
我一直在玩 TypeScript MVC 框架 TypeFramework and am trying to figure out how to create relationships between models. I know it uses the Waterline ORM。具有关系的 Waterline 模型的示例是:
// A user may have many pet
var User = Waterline.Collection.extend({
attributes: {
firstName: 'string',
lastName: 'string',
// Add a reference to Pets
pets: {
collection: 'pet',
via: 'owner'
}
}
});
// A pet may only belong to a single user
var Pet = Waterline.Collection.extend({
attributes: {
breed: 'string',
type: 'string',
name: 'string',
// Add a reference to User
owner: {
model: 'user'
}
}
});
TypeFramework 模型的示例如下所示:
class User extends TF.Model{
firstName: string,
lastName: string
}
TF.Model 的代码是:
class Model {
public id: number;
public createdAt: Date;
public updatedAt: Date;
static collectionName: string;
static schema: boolean;
static adapter: string;
static attributes: any;
private static collection;
public save: <T>(callback: ISingleResultCallback<T>) => void;
public destroy: <T>(callback: INoResultCallback<T>) => void;
static save<T>(model: T, callback: ISingleResultCallback<T>): void;
static destroy<T>(model: T, callback: INoResultCallback<T>): void;
static all<T>(): DbQueryEnd<T>;
static where(query: {}): WL.IQuery;
static get(id: number): DbQueryUnique<any>;
static first<T>(query: {}): DbQueryUnique<T>;
static find<T>(): DbQuery<T>;
static query<T>(query: string): DbQueryRaw<T>;
static validate(attr: string, options: ModelValidation): any;
static validate(attrs: string[], definition: ModelValidation): any;
private static extend(from, to);
}
我不确定如何将关系集成到强类型 TypeFramework 模型中。任何建议或帮助将不胜感激。
所以,让我在不知道这两个框架的所有内部工作原理的情况下做序。但是,我想我知道如何在这里得到你想要的东西。
首先,如果您可以让您的模型使用 Typescript,并且您的基线代码使用 Javascript,那么这将变得容易得多。
但是,如果您想在 Typescript 中使用 Waterline,您可能需要创建 .d.ts 文件。不幸的是,我目前在 DefinitelyTyped 上看不到任何可用的东西。这不是特别容易,但只要有一定的意志力,您可能就能充分理解这个概念并使其发挥作用。 The official guide is pretty good.
话虽如此,开始编写代码!
您需要实例化您的 class,其中包含您需要的所有内容。如果您不将内容放入 class 属性中,您很可能会错过它们。您需要使用 super(); 在您的基础对象上调用构造函数;还有。
class User extends Model
{
firstName: string;
lastName: string;
pets: IPet[];
constructor(firstname: string, lastname: string, pets: IPet[])
{
super();
this.firstName = firstname;
this.lastName = lastname;
this.pets = pets;
}
}
interface IPet
{
breed: string;
petType: string;
name: string;
}
您可能想要制作 Pet 和 actual class,但目前我们假设不是。
那么,按照上述方式创建水线用户所需要做的就是这样:
var User = Waterline.Collection.extend(
new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
);
您可能有一个静态方法可以获取 "prebuilt" 类用户,或通过 ID 获取用户。
static GetJimAndPets() : User
{
return new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
}
static GetUserById(id: number) : User
{
//Logic here
return null;
}
那么您可以更轻松地调用您的方法:
var User = Waterline.Collection.extend(User.GetJimAndPets());
应该可以,但正如我之前提到的,我不知道如何测试它和 YMMV。
我一直在玩 TypeScript MVC 框架 TypeFramework and am trying to figure out how to create relationships between models. I know it uses the Waterline ORM。具有关系的 Waterline 模型的示例是:
// A user may have many pet
var User = Waterline.Collection.extend({
attributes: {
firstName: 'string',
lastName: 'string',
// Add a reference to Pets
pets: {
collection: 'pet',
via: 'owner'
}
}
});
// A pet may only belong to a single user
var Pet = Waterline.Collection.extend({
attributes: {
breed: 'string',
type: 'string',
name: 'string',
// Add a reference to User
owner: {
model: 'user'
}
}
});
TypeFramework 模型的示例如下所示:
class User extends TF.Model{
firstName: string,
lastName: string
}
TF.Model 的代码是:
class Model {
public id: number;
public createdAt: Date;
public updatedAt: Date;
static collectionName: string;
static schema: boolean;
static adapter: string;
static attributes: any;
private static collection;
public save: <T>(callback: ISingleResultCallback<T>) => void;
public destroy: <T>(callback: INoResultCallback<T>) => void;
static save<T>(model: T, callback: ISingleResultCallback<T>): void;
static destroy<T>(model: T, callback: INoResultCallback<T>): void;
static all<T>(): DbQueryEnd<T>;
static where(query: {}): WL.IQuery;
static get(id: number): DbQueryUnique<any>;
static first<T>(query: {}): DbQueryUnique<T>;
static find<T>(): DbQuery<T>;
static query<T>(query: string): DbQueryRaw<T>;
static validate(attr: string, options: ModelValidation): any;
static validate(attrs: string[], definition: ModelValidation): any;
private static extend(from, to);
}
我不确定如何将关系集成到强类型 TypeFramework 模型中。任何建议或帮助将不胜感激。
所以,让我在不知道这两个框架的所有内部工作原理的情况下做序。但是,我想我知道如何在这里得到你想要的东西。
首先,如果您可以让您的模型使用 Typescript,并且您的基线代码使用 Javascript,那么这将变得容易得多。
但是,如果您想在 Typescript 中使用 Waterline,您可能需要创建 .d.ts 文件。不幸的是,我目前在 DefinitelyTyped 上看不到任何可用的东西。这不是特别容易,但只要有一定的意志力,您可能就能充分理解这个概念并使其发挥作用。 The official guide is pretty good.
话虽如此,开始编写代码!
您需要实例化您的 class,其中包含您需要的所有内容。如果您不将内容放入 class 属性中,您很可能会错过它们。您需要使用 super(); 在您的基础对象上调用构造函数;还有。
class User extends Model
{
firstName: string;
lastName: string;
pets: IPet[];
constructor(firstname: string, lastname: string, pets: IPet[])
{
super();
this.firstName = firstname;
this.lastName = lastname;
this.pets = pets;
}
}
interface IPet
{
breed: string;
petType: string;
name: string;
}
您可能想要制作 Pet 和 actual class,但目前我们假设不是。
那么,按照上述方式创建水线用户所需要做的就是这样:
var User = Waterline.Collection.extend(
new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
);
您可能有一个静态方法可以获取 "prebuilt" 类用户,或通过 ID 获取用户。
static GetJimAndPets() : User
{
return new User("Jim", "Bob", [{"breed": "tabby", "petType": "small", "name": "Mittens"}])
}
static GetUserById(id: number) : User
{
//Logic here
return null;
}
那么您可以更轻松地调用您的方法:
var User = Waterline.Collection.extend(User.GetJimAndPets());
应该可以,但正如我之前提到的,我不知道如何测试它和 YMMV。