BookshelfJS必须为hasOne关系定义有效的目标模型

时间:2017-02-24 17:38:25

标签: node.js knex.js bookshelf.js database-relations

我正在为社交网站创建个人资料系统。我无法使用关系来显示来自不同表的用户的各种信息。以下是我的两个BookshelfJS模型:

间:

var user    = require(__base + '/app/database/models/user/user').model;

exports.model = Application.Adapter.Model.extend({
    tableName: 'rooms',
    hasTimestamps: false,
    owner: function() { return this.hasOne(user, 'id', 'owner_id'); }
});

用户:

var user_badges     = require(__base + '/app/database/models/user/user_badges').model,
    user_settings   = require(__base + '/app/database/models/user/user_settings').model,
    rooms           = require(__base + '/app/database/models/room/room').model,
    groups          = require(__base + '/app/database/models/group/group').model;

exports.model = Application.Adapter.Model.extend({
    tableName: 'users',
    hasTimestamps: false,
    badges: function() { return this.hasMany(user_badges, 'user_id', 'id'); },
    settings: function() { return this.hasMany(user_settings, 'user_id', 'id'); },
    rooms: function() { return this.hasMany(rooms, 'owner_id', 'id'); },
    groups: function() { return this.hasMany(groups, 'user_id', 'id'); }
});

这两个模型在不同的页面上完全彼此分开使用。我目前正在使用配置文件页面上的用户模型中的所有关系,这些关系正在运行。我有一个不同的页面,它将显示有关房间的所有信息以及所有者信息。这是我到目前为止使用房间模型的方式

var room    = require(__base + '/app/database/models/room/room').model;

var room_id = 1;

return new room({id: room_id}).fetch({
    withRelated: [
        {'owner': function(qb) {
            qb.column('id','username');
        }}
    ],
    columns: ['id', 'owner_id', 'name']
})

.then(function resolve(result)
{
    if(result == null) return Promise.reject(new Error('invalid_room'));

    return Promise.resolve(result.toJSON());
},

function reject(err)
{
    return Promise.reject(err);
});

这是我收到的错误:

A valid target model must be defined for the rooms hasOne relation

我尝试过使用hasOne和amp;属于但似乎无法让它工作,如果有人有解决方案请让我知道谢谢!

1 个答案:

答案 0 :(得分:0)

当循环引用不可避免(通常是)时,Registry Plugin可能会帮助您进行更简单的设置。

在您的情况下,Application.Adapter看起来像是Bookshelf的一个实例,因此如果您向其添加注册表插件(使用Application.Adapter.plugin('registry')),您的room类应如下所示:

// Take references from the registry instead of using `require`
// Note: assuming 'user' was registered with registry plugin
var user    = Application.Adapter.model('user');

var room = Application.Adapter.Model.extend({
  tableName: 'rooms',
  hasTimestamps: false,
  // Note the use of 'user' instead of user
  owner: function() { return this.hasOne('user', 'id', 'owner_id'); }
});

// Model modules no longer needed to be exported, just registered
Application.Adapter.model('room', room);

请注意,在上面的示例中,不需要从注册表中获取user,因为它从未直接用作模型。但我把它作为如何从注册表中获取模型的一个例子。