为啥我们需要 bookshelf.js 的 fetch() 方法中的新对象?

Posted

技术标签:

【中文标题】为啥我们需要 bookshelf.js 的 fetch() 方法中的新对象?【英文标题】:Why do we need a new object in bookshelf.js fetch() method?为什么我们需要 bookshelf.js 的 fetch() 方法中的新对象? 【发布时间】:2015-08-19 16:56:20 【问题描述】:

我是 Node 新手,我使用 bookshelf.js 作为我当前项目的 ORM。 bookshelf.js 的文档在 fetch() 方法下包含了这个 sn-p:

// select * from `books` where `ISBN-13` = '9780440180296'
new Book('ISBN-13': '9780440180296')
  .fetch()
  .then(function(model) 
  // outputs 'Slaughterhouse Five'
  console.log(model.get('title'));
);

http://bookshelfjs.org/#Model-fetch

让我困惑的是,如果我们要查询现有记录,为什么还要在这里创建一个新对象? bookshelf.js 的工作方式是否需要为每个返回的结果创建一个新对象?

【问题讨论】:

new Book('ISBN-13': '9780440180296')? 这就是 API 的工作原理。你需要调用某个东西的方法,并且需要指定查询参数。 【参考方案1】:

这令人困惑。目前只有一种类型的对象同时代表“模型”和“查询构建器”。

fetch 使用模型上设置的属性预填充 WHERE 子句。

我们正在计划改变这一点。讨论here。

我建议不要像上面那样编写代码,而是这样做:

// select * from `books` where `ISBN-13` = '9780440180296'
Book.where('ISBN-13': '9780440180296')
  .fetch()
  .then(function(model) 
  // outputs 'Slaughterhouse Five'
  console.log(model.get('title'));
);

(我知道你刚刚从文档中直接复制了这个。)

如果您想就地更新模型,最好使用新的Model#refresh:

Book.forge(id: 5).refresh().then(function (book) //...

【讨论】:

以上是关于为啥我们需要 bookshelf.js 的 fetch() 方法中的新对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Bookshelf.js 中查询日期

Bookshelf.js 多态关系查询返回空数组

Bookshelf.js 查询相关表行

Bookshelf.js / Knex.js 嵌套在单个查询中的位置

Bookshelf.js/Knex.js 对 UTC DATETIME 列太“有用”

与 bookshelf.js 的多个多对多关系