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

How to set up my database model in bookshelf.js

本文关键字:设置 我的 数据库模型 js bookshelf      更新时间:2023-09-26

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

我做了一个简单的演示。

用户(表)

  • id(增量)
  • 名称(字符串)

任务(表)

  • id(增量)
  • 描述(字符串)
  • 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);
        })
    })
}

我得到任务,但字段assignd_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);
            })
        })
    })
}

返回以下结果:

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

因此,它然后使用来自创建任务的用户和分配给任务的用户的用户信息填充用户对象内的各个任务。我希望这能帮助到一些人!