在 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
});
您需要详细说明这一点,但考虑到这个概念,文档很有帮助
我有一个任务对象,属于一个工作对象。这是一个 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
});
您需要详细说明这一点,但考虑到这个概念,文档很有帮助