我在我的服务器中使用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
表之间定义几乎所有其他可能的关系,但我不断收到有关未以正确方式定义关系的错误消息。
我怎样才能达到这种关系?
答案 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
因此,我建议您查看用于密钥的案例以及关系子句中放置的对象名称。