Bookshelf.js:一对多关系设置

时间:2018-06-03 11:07:41

标签: bookshelf.js

我正在使用Bookshelf与MySQL进行ORM。我有端点和组织。每个端点都属于一个组织,组织有许多端点。我试图获取与其关联组织的端点列表(s。)这将返回以下错误:

"必须为端点belongsTo关系定义有效的目标模型"

这是我的fetchAll请求:

Endpoint
            .where('organization_id', req.user.attributes.organization_id)
            .fetchAll({require: true,withRelated: ['settings', 'organization']})
            .then((endpoints) => {
                ReS(res, {
                    endpoints
                }, 200);
            })

这是我的终端模型:

'use strict';

const bookshelf = require('../config/bookshelf_instance');
const Organization = require('./organization');
const Settings = require('./endpoint_settings');
const Group = require('./endpoint_group');

module.exports = bookshelf.Model.extend({
    tableName: 'endpoint',
    organization () {
        return this.belongsTo(Organization, 'id');
    },
    settings () {
        return this.hasOne(Settings, 'id');
    },
    group () {
        return this.belongsToMany(Group, 'map_endpoint_endpoint_group');
    }
});

这是我的组织模式:

'use strict';

const bookshelf = require('../config/bookshelf_instance');
const Endpoint = require('./endpoint');
const User = require('./user');
const Group = require('./endpoint_group');

module.exports = bookshelf.Model.extend({
    tableName: 'organization',
    endpoints () {
        return this.hasMany(Endpoint, 'organization_id');
    },
    users () {
        return this.hasMany(User, 'organization_id');
    },
    groups () {
        return this.hasMany(Group, 'organization_id');
    }
});

1 个答案:

答案 0 :(得分:1)

您应该从端点模型的关系规范中删除id,因为这似乎是主键,而不是外键。默认情况下,外键也是organization_id,这是您想要的。它应该与您在相反关系中的匹配(在这种情况下为hasMany)。

从文档中,belongsTo的第二个参数是:

  

此模型中的ForeignKey。默认情况下,foreignKey被假定为Target模型tableName的单数形式,后跟_id。

目标模型的表名是organization,这意味着默认情况下外键为organization_id