用Bookshelf查询

时间:2018-04-20 05:35:18

标签: javascript rdbms knex.js bookshelf.js

我最近开始使用Bookshelf。文档中的示例对我来说并不是很清楚。这是一个这样的例子:

var knex = require('knex')({
  client: 'mysql',
  connection: process.env.MYSQL_DATABASE_CONNECTION
});
var bookshelf = require('bookshelf')(knex);

var User = bookshelf.Model.extend({
  tableName: 'users',
  posts: function() {
    return this.hasMany(Posts);
  }
});

var Posts = bookshelf.Model.extend({
  tableName: 'messages',
  tags: function() {
    return this.belongsToMany(Tag);
  }
});

var Tag = bookshelf.Model.extend({
  tableName: 'tags'
})

User.where('id', 1).fetch({
  withRelated: ['posts.tags']
}).then(function(user) {
  console.log(user.related('posts').toJSON());
}).catch(function(err) {
  console.error(err);
});

创建三个模型(用户,帖子和标签)后,有一个查询。

  1. 这个查询究竟是什么意思?

    User.where('id', 1).fetch({withRelated: ['posts.tags']}).then(function(user) {
      console.log(user.related('posts').toJSON());
    }).catch(function(err) {
      console.error(err);
    });
    
  2. 什么是withRelated'posts.tags'user.related('posts')?谁能告诉我最简单的形式,这些术语是什么以及它们来自哪里?

  3. 最后,完整查询的含义是什么?

1 个答案:

答案 0 :(得分:2)

这些都在文档中得到了解答,虽然并非所有内容都在完全相同的位置,所以我可以理解你的困惑。你真的必须阅读整个事情才能更好地理解它。

来自documentation of Model.fetch()

  

withRelated :使用模型实例检索的关系。一个或多个关系名称(...)可以将单个属性或属性数组指定为withRelated属性的值。

来自Collection.fetch()

  

可以指定withRelated选项来获取集合的模型,急切加载在模型上命名的任何指定关系。

来自Collection.load()

  

... 可以通过将嵌套关系与.

分开来指定嵌套的预先加载

来自Model.related()

  

相关方法返回在模型上的关系哈希上加载的指定关系,或调用关联的关系方法并将其添加到关系哈希(如果存在且尚未加载)。

所有这些都涉及到模型上关系的急切加载。

这些方法的作用是以某种方式从与父模型表相关的表中加载一些数据。在您发布的示例中,用户模型有一些帖子,帖子本身有一些标签,因此关系类似于:

User
  |_ Post
       |_ Tag

这些表示为每个模型上的方法,例如,用户模型中的posts: function() { ... }

使用withRelated指定与预先加载的关系时,可以使用这些方法名称。此外,您可以通过使用.将它们分开来加载深层嵌套关系,这就是您在示例中看到的内容。

因此,将所有内容放在一起该示例正在执行的是搜索具有id = 1的用户,并检索属于该用户的所有帖子以及属于属于所有帖子的所有帖子用户。

然后,要访问这些相关对象,请使用模型的related('something')方法。