Nodejs Bookshelf中的简单引用关系

时间:2016-02-10 15:15:45

标签: node.js orm bookshelf.js

我在我的服务器中使用Bookshelf库作为ORM,而且我无法定义非常简单的关系。

我有一个实用程序表,很多其他表都没有引用这些表。

例如:

Languages表,包含语言记录(id,value)

带有帖子数据和帖子语言的

Posts表格(id,....,language_id)

Users表,用户数据是用户选择的语言(id,...,language_id)

其他一些具有相同逻辑的表 - 只保留Language表的外键。

根据文档,belongsTo方法上的外键参数应指向模型中定义它的字段。

所以我已经定义了这样的模型:

var Language = bookshelf.Model.extend({
  tableName: 'languages',
  idAttribute: 'LanguageID',

});

var Post = bookshelf.Model.extend({
   tableName: 'posts',
   idAttribute: 'PostID',

   Language: function() {
       return this.belongsTo(Language, 'LanguageID');
   },
});

我的查询是:

 Post
   .where({PostID: 1})
   .fetch({withRelated:['Language']})
   .then(function(post) {
      console.log(JSON.stringify(post.related('Language')));
    });

错误消息为:

Unhandled rejection Error: A valid target model must be defined 
for the posts belongsTo relation

我试图在这些表和Languages表之间定义几乎所有其他可能的关系,但我不断收到有关未以正确方式定义关系的错误消息。

我怎样才能达到这种关系?

1 个答案:

答案 0 :(得分:0)

我无法重现您的确切错误消息,但可能您的代码在某处不匹配。

以下是使用SQLite3(节点4.2.2,bookshelf 0.9.1,knex 0.9.0和sqlite3 3.1.1)的工作示例:

使用private void button_delete_Click(object sender, EventArgs e) { this.Controls.Remove(btnLastClicked); count = count - 1; label1.Text = count.ToString(); }

sqlite3 data.sqlite3

在节点上:

create table languages (languageid int primary key, name text);
create table posts(postid int primary key, languageid int, text text);
insert into languages values (1, 'english');
insert into languages values (2, 'german');
insert into posts values(1, 2, 'etwas geschrieben');
insert into posts values(2, 1, 'something written');
insert into posts values(3, 1, 'something else written');

相反,如果我在var knex = require('knex')({client:'sqlite3',connection:{filename: 'data.sqlite3'}}); var bookshelf = require('bookshelf')(knex); var Language = bookshelf.Model.extend({tableName: 'languages', idAttribute: 'languageid'}); var Post = bookshelf.Model.extend({tableName: 'posts', idAttribute: 'postid', Language: function(){return this.belongsTo(Language,'languageid');}}); Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.toJSON());}); // Outputs: // { postid: 3, // languageid: 1, // text: 'something else written', // Language: { languageid: 1, name: 'english' } } Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.related('Language').toJSON());}); // Outputs: // { languageid: 1, name: 'english' } 上使用错误的languages来定义帖子:

belongsTo()

此外,如果您使用与定义目标时使用的大小写不同的大小写定义关系键,它将无声地匹配:

var Post = bookshelf.Model.extend({tableName: 'posts', idAttribute: 'postid', Language: function(){return this.belongsTo(language,'languageid');}});
// note there was no error yet
Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.related('Language').toJSON());});
// Fails with: Unhandled rejection ReferenceError: language is not defined

因此,我建议您查看用于密钥的案例以及关系子句中放置的对象名称。