在 bookshelf.js 中,我不明白如何从我的模板的 hasOne() 关系中的目标检索属性

In bookshelf.js, I don't understand how to retrieve attribute from targets in hasOne() relationship for my template

我有一个任务对象,属于一个工作对象。这是一个 belongsTo() 关系,但我使用的是 hasOne() 关系,因为我无法弄清楚 belongsTo()。

我的模型是:

var job = Bookshelf.Model.extend({
    tableName: 'jobs',
    idAttribute: 'id'
});

var task = Bookshelf.Model.extend({
    tableName: 'tasks',
    idAttribute: 'id',
    job: function() {
        return this.hasOne(Job);
    },
    job_summary: function() {
        return this.job().fetch().get('summary');
    }
});

我尝试了 .job_summary() 函数的几种组合,但似乎没有任何效果。当我创建一个任务对象时,我只想能够得到相关任务的工作摘要,比如:

var task_jobsummary = task.job_summary();

我错过了什么?

编辑:我实际上有 2 个 hasOne() 目标需要获取数据。

编辑:我认为我的问题是不理解承诺。如果我在 PHP 中这样做,我会做类似的事情:

$myvar = stdClass();
$myvar->somefield = $task->getSomefield();
$myvar->anotherfield = $task->getAnotherField();
$myvar->jobfield = $job->getSomeJobField();
// ... etc

我想从 fetch() 之后的 then() 中获取简单的 return 值。

编辑:这是我的路由器代码:

var route_task(req, res, next) {
    res.locals.username = 'debug_username';
    res.locals.userpic = '/img/tmpuserpic.png';

    new Model.Task().fetch({id: req.params.id, withRelated: ['job']})
    .then(function(task) {
        task.related('job').fetch().then(function(job) {
            res.locals.somefield = job.get('somefield');
        });
    })
    .then(function() {
        res.render('task');
    })
}

模型前面的两个变量设置好了,我的模板看到了。但是,模板看不到 res.locals.somefield 设置。

你有点困惑,你需要在你有钥匙的地方有 belongsTo 和基本上它指向的地方有 hasOne。

例如 post 有很多(但在概念上是相等的)评论并且评论属于 post.

在模型中你只需要说出关系是什么,当你想检索它时(也许在控制器中)你需要做这样的事情

new Model({id:4})
  .fetchOne({withRelated: ['thing']})
  .then(function(model) {
       // retrive the relation
       var things = model.things(); // you already had the query done
  });

您需要详细说明这一点,但考虑到这个概念,文档很有帮助