1
我对bookshelf.js相当陌生,请耐心等待。Bookshelf.js - hasOne的关系不太好
因为我在学习,所以我使用MySQL并且有一个非常简单的结构。即,两个实体,一个辅助键。这里是我的结构:
CREATE TABLE IF NOT EXISTS `city` (
`city_id` int(11) NOT NULL,
`code` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE IF NOT EXISTS `people` (
`people_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `city`
ADD PRIMARY KEY (`city_id`);
ALTER TABLE `people`
ADD PRIMARY KEY (`people_id`), ADD KEY `city_id` (`city_id`);
ALTER TABLE `people`
ADD CONSTRAINT `people_ibfk_1` FOREIGN KEY (`city_id`) REFERENCES `city` (`city_id`);
而且这是我在expressjs代码,用书架:
var City = bookshelf.Model.extend({
tableName: 'city'
});
var User = bookshelf.Model.extend({
tableName: 'people',
city: function(){
return this.hasOne(City, 'city_id');
}
});
这就是我如何运行我的查询中的示例代码:
new User().where({people_id: req.params.id })
.city()
.fetch()
.then(function(user){
res.send(user.toJSON());
})
.catch(function(error){
res.send(error);
});
然而,当我运行的应用程序,我什么也没有,但空的JSON:
{}
我已经启用在书架调试模式,这是它试图执行查询:
{ __cid: '__cid1',
method: 'select',
options: undefined,
bindings: [ undefined, 1 ],
sql: 'select `city`.* from `city` where `city`.`city_id` = ? limit ?' }
现在,我已经说过了,我是新来的书架。但这没有道理;为什么不把city.city_id与person.city_id(外键)进行比较?
谢谢你的时间和答案!
如何进入市区约不改变模式? – 2015-12-21 19:46:28
您可以使用idAttribute属性在模型中定义主键(如果它不是“id”):http://bookshelfjs.org/#Model-instance-idAttribute – 2016-01-29 19:36:34