gpt4 book ai didi

node.js - Nodejs Bookshelf 中的简单引用关系

转载 作者:搜寻专家 更新时间:2023-11-01 00:06:38 25 4
gpt4 key购买 nike

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

我有一个实用程序表,许多其他表都在引用这些表,而这些表没有任何外键。

例如:

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

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 表之间几乎所有其他可能的关系,但我不断收到有关未正确定义关系的错误消息。

我怎样才能实现这种关系?

最佳答案

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

这是一个使用 SQLite3( Node 4.2.2、书架 0.9.1、knex 0.9.0 和 sqlite3 3.1.1)的工作示例:

使用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');

在 Node 上:

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' }

相反,如果我在 belongsTo() 上使用错误大小写的 languages 定义 Post:

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

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

// note using `LanguageID` instead of `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.related('Language').toJSON());});
// Outputs and empty list (no matches!):
// {}

因此我建议您查看用于键的大小写和放置在关系子句上的对象名称。

关于node.js - Nodejs Bookshelf 中的简单引用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35318940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com