如何在 bookshelf.js 中设置我的数据库模型

How to set up my database model in bookshelf.js

在使用 knex 处理我所有的数据库需求后,我一直在研究 bookshelf.js 来设置模型并获得更多结构。

我用一个简单的演示试了一下。

用户 (table)

任务 (table)

然后我这样定义我的模型。

var User = bookshelf.Model.extend({
    tableName: 'user',
    assigned_tasks: function(){
        return this.hasMany(Task, ['assigned_to']);
    },
    created_tasks: function(){
        return this.hasMany(Task, ['created_by']);
    }
})

var Task = bookshelf.Model.extend({
    tableName: 'task',
    created_by_user: function(){
        return this.belongsTo(User, ['created_by'], ['id']);
    },
    assigned_to_user: function(){
        return this.belongsTo(User, ['assigned_to'], ['id']);
    }
})

当我运行以下函数时,我得到了我想要的响应。

function getAllUsers(){
    new User().fetchAll({withRelated: ['assigned_tasks', 'created_tasks']}).then(function(result){
        var data = result.toJSON();
        data.forEach(function(user){
            console.log(user);
        })
    })
}

我得到所有用户的数组,然后包含分配给该用户的任务数组,以及该用户创建的任务数组。

但是当我运行下面的函数

function getAllTasks(){
    new Task().fetchAll({withRelated: ['assigned_to_user', 'created_by_user']}).then(function(result){
        var data = result.toJSON();
        data.forEach(function(task){
            console.log(task);
        })
    })
}

我得到了任务,但是字段 assigned_to_user 和 created_by_user 只是空对象。

{ id: 1,
  description: 'Ta på folk',
  project_id: '1',
  priority: 2,
  start_date: null,
  due_date: null,
  end_date: null,
  status: 1,
  created_by: 1,
  assigned_to: 2,
  created_at: null,
  updated_at: null,
  assigned_to_user: {},
  created_by_user: {} }

这里有什么我没说到的吗?任务不应该包含一个对象和被引用的用户吗?

谢谢

所以我想通了。 似乎我的语法是唯一错误的地方。

所以当这样做时:

var Task = bookshelf.Model.extend({
    tableName: 'task',
    created_by: function(){
        return this.belongsTo(User, 'created_by');
    },
    assigned_to: function(){
        return this.belongsTo(User, 'assigned_to');
    }
})

我的任务已返回,其中 created_by 和 assigned_to 对象填充了信息。

{ id: 1,
  description: 'Ta på folk',
  project_id: '1',
  priority: 2,
  start_date: null,
  due_date: null,
  end_date: null,
  status: 1,
  created_by:
   { id: 1,
     name: 'Stian Bakken',
     slack_name: 'stiba',
     slack_id: 'RU233UR',
     nickname: 'the dog',
     created_at: null,
     updated_at: null },
  assigned_to:
   { id: 2,
     name: 'Thomas Feit',
     slack_name: 'thraxx',
     slack_id: 'RJKJK42',
     nickname: 'The cave',
     created_at: null,
     updated_at: null },
  created_at: null,
  updated_at: null }

在获取多维关系时,我还想出了另一件事。

function getAllUsers(){
    new User().fetchAll({withRelated: ['assigned_tasks', 'created_tasks', 'assigned_tasks.assigned_to', 'assigned_tasks.created_by', 'created_tasks.assigned_to', 'created_tasks.created_by']}).then(function(result){
        var data = result.toJSON();
        data.forEach(function(user){
            console.log(user);
            user.assigned_tasks.forEach(function(task){
                console.log(task);
            })
        })
    })
}

Returns 结果如下:

{ id: 1,
  name: 'Stian Bakken',
  slack_name: 'stiba',
  slack_id: 'RU233UR',
  nickname: 'the dog',
  created_at: null,
  updated_at: null,
  assigned_tasks: [],
  created_tasks:
   [ { id: 1,
       description: 'Ta på folk',
       project_id: '1',
       priority: 2,
       start_date: null,
       due_date: null,
       end_date: null,
       status: 1,
       created_by: [Object],
       assigned_to: [Object],
       created_at: null,
       updated_at: null } ] }

因此,它随后使用创建任务的用户和任务分配给的用户的用户信息填充用户对象中的各个任务。我希望这对某人有所帮助!