BookshelfJS 必须为 hasOne 关系定义有效的目标模型
BookshelfJS A valid target model must be defined for the hasOne relation
我正在为社交网站创建个人资料系统。我在使用关系显示来自不同表的用户的各种信息时遇到问题。这是我的两个 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 和 belongsTo 但似乎无法正常工作,如果有人有解决方案请告诉我,谢谢!
当循环引用不可避免(通常是)时,Registry Plugin 可能会帮助您简化设置。
在你的情况下,它看起来像 Application.Adapter
是 Bookshelf 的一个实例,所以如果你向它添加注册表插件(使用 Application.Adapter.plugin('registry')
)你的 room
class应该看起来像:
// 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
,因为它从未直接用作模型。但我将其作为如何从注册表中获取模型的示例。
我正在为社交网站创建个人资料系统。我在使用关系显示来自不同表的用户的各种信息时遇到问题。这是我的两个 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 和 belongsTo 但似乎无法正常工作,如果有人有解决方案请告诉我,谢谢!
当循环引用不可避免(通常是)时,Registry Plugin 可能会帮助您简化设置。
在你的情况下,它看起来像 Application.Adapter
是 Bookshelf 的一个实例,所以如果你向它添加注册表插件(使用 Application.Adapter.plugin('registry')
)你的 room
class应该看起来像:
// 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
,因为它从未直接用作模型。但我将其作为如何从注册表中获取模型的示例。