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

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

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

我通过一个简单的演示进行了尝试。

用户(表)

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

任务(表)

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

我得到了任务,但字段分配给用户和创建的用户只是空对象。

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

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

关于javascript - 如何在 bookshelf.js 中设置我的数据库模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174552/

相关文章:

javascript - 如何访问 Handlebars 中的 app.locals 变量

javascript - Jquery 没有效果

javascript - 使用 ng-if 时不显示 ionic View 标题

javascript - 将 Javascript 响应转换为 Array/Map

php - 从mysql反序列化数据

mysql - 分割逗号分隔的字符串 --> FUNCTION db.CHARINDEX 不存在

javascript - .toFixed() 调用负指数返回一个数字,而不是一个字符串

PHP 超时覆盖没有明确的解释

node.js - 如何部署分离的前端和后端?

android - 如何在这种复杂的数据传输场景中最大限度地提高效率