如何在bookshelf.js

时间:2016-07-03 21:36:35

标签: javascript mysql node.js bookshelf.js knex.js

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

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

用户(表格)

  • id(增量)
  • name(string)

任务(表格)

  • id(增量)
  • description(string)
  • created_by(整数).references('user.id')
  • assigned_to(整数).references('user.id')

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

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: {} }

有什么东西我没有来这儿吗?该任务是否应该包含一个带有引用用户的Object?

由于

1 个答案:

答案 0 :(得分:0)

所以我想出来了。 似乎我的语法是唯一错误的。

所以这样做:

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);
            })
        })
    })
}

返回以下结果:

{ 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 } ] }

然后,它会使用创建任务的用户和分配任务的用户信息填充用户对象内的各个任务。我希望这有助于某人!