我正在为我正在做的项目构建一个ORM。我在ORM中有两个类,BaseModel
和SessionLink
,并且它们外部的函数都试图使用它们。 BaseModel
是基本模型 - 其他模型继承的模型,以便我可以定义常见行为。 SessionLink
是继承模型之一。
我希望能够使用继承的模型从BaseModel
链接查询方法。像这样:
SessionLink.join("a table").where({some: "conditions"}).get()
为了做到这一点,我需要在BaseModel
上有一个静态属性来存储通过链式方法构建的查询。到现在为止还挺好。我把这个静态属性放在了getter和setter中。
class BaseModel {
static get queryBuilder() {
return this._query || null;
}
static set queryBuilder(val) {
this._query = val;
}
static join(table) {
if (this.queryBuilder) {
// Add to existing query
this.queryBuilder = this.queryBuilder.addJoin(table);
}
else {
// Create a new query, store it in queryBuilder
this.queryBuilder = new Query().addJoin(table);
}
}
static where(conditions) {
// Implementation similar to .join
}
static get() {
// Actually send the query to the database and return results
magicallyGetDatabaseConnection().sendQuery(this.queryBuilder);
}
}
SessionLink
只是继承自BaseModel
(class SessionLink extends BaseModel
),并添加了一些与此问题无关的特定于模型的详细信息。
我遇到的问题是:queryBuilder
没有保留其价值。我可以从this.queryBuilder = new Query(...)
或join
或任何地方运行where
,然后在下一行上记录this.queryBuilder
的值,然后返回null
。换句话说:
static join(table) {
if (this.queryBuilder) {
// Add to existing query
this.queryBuilder = this.queryBuilder.addJoin(table);
}
else {
// Create a new query, store it in queryBuilder
this.queryBuilder = new Query().addJoin(table);
console.log(this.queryBuilder); // null
}
}
这是为什么?我该如何解决?
答案 0 :(得分:2)
您可以通过不在一行中实例化和调用addJoin
来解决此问题:
this.queryBuilder = new Query()
this.queryBuilder.addJoin(table)
或者从this
方法
addJoin()
class Query {
addJoin(table) {
// existing code
return this
}
}